Note: this is a harder version of Mirrored string I.
The gorillas have recently discovered that the image on the surface of the water is actually a reflection of themselves. So, the next thing for them to discover is mirrored strings.
A mirrored string is a palindrome string that will not change if you view it on a mirror.
Examples of mirrored strings are "MOM", "IOI" or "HUH". Therefore, mirrored strings must contain only mirrored letters {A, H, I, M, O, T, U, V, W, X, Y} and be a palindrome.
e.g. IWWI, MHHM are mirrored strings, while IWIW, TFC are not.
A palindrome is a string that is read the same forwards and backwards.
Given a string S of length N, help the gorillas by printing the length of the longest mirrored substring that can be made from string S.
A substring is a (possibly empty) string of characters that is contained in another string S. e.g. "Hell" is a substring of "Hello".
The first line of input is T – the number of test cases.
Each test case contains a non-empty string S of maximum length 1000. The string contains only uppercase English letters.
For each test case, output on a line a single integer - the length of the longest mirrored substring that can be made from string S.
Example
Input
Copy
3
IOIKIOOI
ROQ
WOWMAN
Output
Copy
4
1
3
#include <iostream>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<deque>
#include<stack>
using namespace std;
int check(char c)
{
if(c=='A'||c=='H'||c=='I'||c=='M'||c=='O'||c=='T'||c=='U'||c=='V'||c=='W'||c=='X'||c=='Y')
return 1;
else
return 0;
}
int main()
{
char con[1009];
int n,m,i,p,j,t,k;
int ans,head=0;
scanf("%d",&t);
for(i=1; i<=t; i++)
{
ans=head=0;
scanf("%s",con);
k=strlen(con);
for(j=0; j<k; j++)
{
ans=0;
n=j;
m=k-1;
p=0;
while(1)
{
if(n>m)
break;
if(check(con[n])&&check(con[m])&&con[n]==con[m])
{
ans++;
if(n==m)
break;
n++;
m--;
}
else
{
p++;
ans=0;
n=j;
m=k-1-p;
}
}
if(n==m) //应当注意回文串长度为奇数还是偶数的判别
ans=2*ans-1;
else
ans=ans*2;
if(ans>head)
head=ans;
}
printf("%d\n",head);
}
return 0;
}