分析
s s s的范围很小,可以 O ( n 2 ) O(n^2) O(n2),在规定复杂度以内来完成枚举所有子串判断是否有满足条件的最大的子串,可以在第一层循环枚举子串长度 d d d,第二层循环枚举左右端点,通过双指针维护区间。对长度取最大值。
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
string s;
cin >> s;
int ans = 0;
int cnt = 0;
int n = s.size();
for(int d = 1; d <= n; d ++) {
cnt = 0;
for(int i = 0, j = 0; i + d < n; i ++) {
cnt += (s[i] == s[i +d] || s[i] == '?' || s[i + d] == '?');
while(i - j + 1 > d && j + d < n) {
cnt -= (s[j] == s[j + d] || s[j] == '?' || s[j + d] == '?');
j ++;
}
if(cnt == d) {
ans = max(ans, d * 2);
break;
}
}
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T --) {
solve();
}
}