CF1948D

GsGXT發表於2024-09-02

CF1948D

連結:

Problem - 1948D - Codeforces

題目大意:

給你一個字串,字串由小寫字母和?組成,?可以變成任何數,問你重複子字串的最大長度

定義重複子字串為,任意i都滿足s[i] = s[i + len]的子字串

思路:

  • 列舉長度,然後對於每個長度,寫一個f表表示是否可以喝i+len處對應,
  • 然後找最長連續的f 為 1的長度,判斷是否>=len,如果大於等於那麼這個len就是可行的,最後找到最大的可行len即可,也可以倒序列舉len,找到符合要求len直接輸出

程式碼:

void solve(){
	string s;
	cin >> s;
	int n = s.size();
	s = " " + s;
	int f[n + 1];
	for(int len = n/2;len >= 1;len--){
		memset(f,0,sizeof f);
		for(int i = 1;i+len <= n;i++){
			if(s[i]==s[i+len]||s[i]=='?'||s[i+len]=='?') f[i] = 1;
		}
		int cnt = 0;
		for(int i = 1;i <= n;i++){
			if(f[i] == 1){
				cnt++;
				if(cnt==len){
					cout << len*2 << endl;
					return;
				}
			}else{
				cnt = 0;
			}
		}
	}
	cout << 0 << endl;

}

時間複雜度

\(O(n^2)\)