题意:
就是给你一个字符串,然后可以从中间某个地方切开,前面的接到后面,问你操作后最长的回文子串,当然也可以不操作。
思考:
数据范围比较大,n方之后就只能用manachar做了。
代码:
int T,n,m,k;
int va[N];
int Manacher(string s)
{
string t = "$#";
for (int i = 0; i < s.size(); ++i) {
t += s[i];
t += "#";
}
int ans = 0;
vector<int> p(t.size(), 0);
int mx = 0, id = 0;
for (int i = 1; i < t.size(); ++i) {
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
while (t[i + p[i]] == t[i - p[i]]) ++p[i];
if (mx < i + p[i]) {
mx = i + p[i];
id = i;
}
ans = max(ans , p[i]) ;
}
return ans-1;
}
signed main()
{
IOS;
string s;
cin>>s;
int maxn = 0;
for(int i=0;i<s.size();i++)
{
string a = s.substr(0,i);
string b = s.substr(i,s.size()-i);
string S = b+a;
maxn = max(maxn,Manacher(S));
}
cout<<maxn;
return 0;
}
总结:
多多积累经验。