[算法] 问题数 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