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)\)