[アルゴリズム] 問題番号 7

スレッド: リンク
郵便番号: VOSSEVEN
N 文字の文字列が与えられた場合, 各文字はから数字です 0 へ 9
リクエスト: 各セグメントの数 7 子供はそれが文字列で表示された回数を数えるの連続を参照してください。.

入力

文字列

出力

各行には、対応する長さの低位から高位までの出現数が記録されます。. 入力データには最小の文字列が含まれることが保証されます 1 数 7. 出現回数が次と等しい場合 0 その場合は何も印刷されません.

入力: 72774777 出力:
1 6
2 3
3 1
リミット:

  • 30% N によるテストの数 <= 10^3.
  • 30% N によるテストの数 <= 10^5.
  • すべての N テストで <= 10^6.

* fに電話する[で] 数字のみを含む文字列の数です 7 連続していて長さ i を持つ.
たとえば文字列の場合 72774777 その後f[1] = 1, F[2] = 1, F[3] = 1.
* 電話応答[で] 文字列 s に現れる長さ i の文字列の数です。. 単語文字列の長さが i の場合、それが作成されることが簡単にわかります。 1 長さ i の文字列, 2 長さの文字列 (iは、1), … , fがあれば[で] f を生成する長さの文字列[で] 長さ i の文字列, F[で]*(i-j+1) 長さ j の文字列.
VDf[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.
->ラウンドiを閲覧, もしfなら[で]>0:
->アン[J]=ans[J]+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 を使用する場合、改行は次と等しくなります “\N” endl はそれに比べてはるかに遅いため “\N”, このグループにはまってしまいました. 幸いなことに、上記のアドバイスを参考にした後、 VNOI