[算法] 问题数 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
最新评论