ブルーブリッジカップ文字列統計C++アルゴリズムトレーニングHERODINGブルーブリッジカップの道


リソース制限時間制限:1.0 sメモリ制限:512.0 MBの問題は、所与の長さnの文字列Sを記述し、もう一つの数字Lがあり、統計長はLの出現回数が最も多いサブ列(異なる出現は交差することができる)より大きく、複数があれば、出力が最も長い場合、出力がまだ複数であれば、出力が最初に最も早く現れる.フォーマットの最初の行の数値Lを入力します.2行目は文字列Sである.Lは0より大きく、Sの長さを超えない.フォーマットの1行、タイトルに要求される文字列を出力します.
入力サンプル1:4 bbaabbaaa
出力サンプル1:bbaa
入力サンプル2:2 bbaabbaaa
出力サンプル2:aaデータ規模と約定n<=60 Sのすべての文字は小文字英字である.ヒントすべての可能なサブストリングを列挙し、出現回数を統計し、条件に合致するものを探し出す.
問題を解く構想:問題のヒントはすでにはっきりしていて、列挙は終わりました!列挙の構想は3つのforサイクルであり、第1層のforサイクルはサブ列の長さを制限し、第2層のforサイクルはその長さのすべてのサブ列を遍歴し、第3層のforサイクルはそのサブ列と同じすべてのサブ列を検索し、数を統計する.コードは次のとおりです.
#include

using namespace std;

int main() {
	int n, i, j, k;
	int num = 0;//     
	string S, str1, str2, temp;// str1         ,st2       ,temp str1      
	cin >> n >> S;
	int len = S.length();//     
	for (i = len; i >= n; i --) {//     
		for (j = 0; j < len - i; j ++) {//     
			int t_num = 0;
			str1.assign(S, j, i);// temp  S  j     i   
			for (k = 0; k < len - i; k ++){
				temp.assign(S, k, i);// temp  S  k     i    
				if(temp == str1){
					t_num ++;
				}
			}
			if (t_num > num) {
				num = t_num;
				str2 = str1;
			}
		}
	}
	cout << str2;
	return 0;
}