[算法] 问题数 7
主题: 链接
代码文章: VOSSEVEN
鉴于N个字符字符串, 每个字符是从一个位 0 到 9
要求: 各段的数 7 连续看到孩子算多少次出现的字符串.
输入
字符串s
产量
每行包含从低到高的相应的长度和数字它发生. 字符串数据,以确保至少 1 号码 7. 如果出现的次数 0 他们不打印.
例
输入: 72774777 产量:
1 6
2 3
3 1
限制:
- 30% 有些测试有N个 <= 10 ^ 3.
- 30% 有些测试有N个 <= 10 ^ 5.
- 在所有测试ñ <= 10 ^ 6.
* 调用F[在] 是数字的唯一字符串 7 连续并且具有I的长度.
VD与链 72774777 那么f[1] = 1, ˚F[2] = 1, ˚F[3] = 1.
* 答打电话[在] 是出现在字符串长度字符串s我. 不难看出,如果该字符串的长度是从我将创建 1 串长度i, 2 字符串长度 (I-1), … , 如果f[在] 串长度i将是输出F[在] 串长度i, ˚F[在]*(I-J + 1) 字符串长度为j.
MD˚F[1] = 1 那里 1 字符串长度 1.
˚F[2] = 1 那里 1 字符串长度 2, ˚F[2]*(2-1+1) = 2 字符串长度 1.
˚F[3] = 1 那里 1 字符串长度 3, ˚F[3]*(3-2+1) = 2 字符串长度 2, ˚F[3]*(3-1+1) = 3 字符串长度 1.
->浏览圆我, 如果f[在]> 0:
->年[Ĵ]=年[Ĵ]+˚F[在]*(I-J + 1), 其中j<=i.
Cuối cùng là in ra các giá trị i mà ans[i]>0.
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main(){
string s;
cin >> s;
int n = s.length();
int *f = new int[n + 1];
int *ans = new int[n + 1];
for (int i=0; i<=n; i++){
f[i] = ans[i] = 0;
}
// duyet tinh f[i]
for (int i=0; i<n; i++){
int c = 0;
while(i < n && s[i] == '7'){
c++;
i++;
}
if (c > 0){
f++;
}
}
/*
for (int i=1; i<=n; i++){
cout << f[i] << " ";
}
cout << endl;
*/
// duyet tinh ans[i]
for (int i=n; i>0; i--){
if (f[i] > 0){
for (int j=0; j<=i; j++){
ans[j] += f[i]*(i-j+1);
}
}
}
// duyet in ra ket qua
for (int i=1; i<=n; i++){
if (ans[i] > 0){
printf("%d %d\n", i, ans[i]);
}
}
//cout << endl;
return 0;
}
在上面的代码,你需要记住导出结果时,应 的printf, 如果使用的话通过COUT,然后向下行 “\ñ” 因为ENDL会慢多了很多更 “\ñ”, 这个地方有坚持他的代表团. 在值得庆幸的是请教高手后 VNOI



最新评论