codeforces round 163 div2
D.Tandem Repeats?
思路
可以枚举l和r两个边界,然后判断是否符合条件,这样的做法是o(n3)的,会超时,
可以换个思路,枚举长度len,在len相同的情况下,可以从左往右遍历,时间是o(n2)的,然后用前缀和维护
代码
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#define endl '\n'
using namespace std;
const int N = 5050;
string s;
int tlen[N];
void solve() {
cin >> s;
int n = s.size();
s = " " + s;
int ans = 0;
for (int len = n / 2; len >= 1; len--) {
for (int j = 1; j + len <= n; j++)
if (s[j] == s[j + len] || s[j] == '?' || s[j + len] == '?') tlen[j] = 1, tlen[j] += tlen[j - 1];
else tlen[j] = 0, tlen[j] += tlen[j - 1];
for (int j = len; j + len <= n; j++) if (tlen[j] - tlen[j - len] == len) ans = max(ans, len);
}
cout << ans * 2 << endl;
}
int main() {
cin.tie(nullptr)->ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}