#贪心 #枚举 ## 思路 首先我们可以很轻松地写出一个 $\mathcal O(n^3)$,大约就是先枚举左边界,然后用两个 [[vector]] 模拟子串两边的数字,再用一个循环判断是否相等。但是这样子会超时。我们发现判断字符串相等很慢,因此可以加入一个很简单的优化:如果当前产生的答案不会更优的话就不判断。时间复杂度为 $\mathcal O(|s|^2)$。 ## 代码 ```cpp #include <iostream> #include <string> #include <vector> using namespace std; int t, head, ans; string s; vector<int> l, r; bool check() { for (int i = 0; head + i < r.size(); i++) { if (l[i] != r[head + i] && l[i] != '?' && r[head + i] != '?') { return 0; } } return 1; } int main() { for (cin >> t; t; t--) { cin >> s, ans = 0; for (int i = 0; i < s.size(); i++) { head = 0, l.clear(), r.clear(); for (int j = i + 1; j < s.size(); j += 2) { r.push_back(s[j - 1]), r.push_back(s[j]); l.push_back(r[head]), head++; j - i + 1 > ans && check() && (ans = max(ans, j - i + 1)); } } cout << ans << '\n'; } return 0; } ```