题意:
求最长回文子串,但每个字母也必须是回文的
思路:
马拉车,但奇数长度的回文串需要特判
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
const int inf= 0x3f3f3f3f;
int n,m;
set<char> se;
char s[maxn];
char ma[maxn*2];
int mp[maxn*2];
void init()
{
se.insert('A');
se.insert('H');
se.insert('I');
se.insert('M');
se.insert('O');
se.insert('T');
se.insert('U');
se.insert('V');
se.insert('W');
se.insert('X');
se.insert('Y');
se.insert('#');
}
int Manacher(int len)
{
int l = 0;
ma[l++] = '$';
ma[l++] = '#';
for(int i = 0 ; i < len; i++)
{
ma[l++] = s[i];
ma[l++] = '#';
}
ma[l] = 0;
int mx = 0,id = 0;
for(int i = 0 ; i <l; i++)
{
mp[i] = mx>i?min(mp[2*id-i],mx-i):1;
while(ma[i+mp[i]] == ma[i-mp[i]]&&se.count(ma[i+mp[i]]))
mp[i]++;
if(i+mp[i]>mx)
{
mx = i + mp[i];
id = i;
}
}
}
int main()
{
ios::sync_with_stdio(0);
init();
int t;
cin>>t;
while(t--)
{
cin>>s;
int len =strlen(s);
Manacher(len);
int ans = 0;
for(int i = 0; i < 2 *len + 2; i++)
{
if(se.count(ma[i])==0)
mp[i] = 1;
ans =max(ans,mp[i]-1);
}
cout<<ans<<endl;
}
}