Mirrored String II Gym - 101350I 求最长回文串

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".

Input

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.

Output

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
3
IOIKIOOI
ROQ
WOWMAN
Output
4
1
3
队友写的

#include<iostream>
#include<cstring>
#include <cstdio>
#include <cmath>
using namespace std;
char str1[110010],str2[110010*2],str[110010];
int n,a[110010*2];
int min(int x,int y)
{
    return x>y?y:x;
}
void bian(int len)
{
    int i;
    n=1;
    str2[0]='$';
    for(i=0;i<len;i++)
    {
        str2[n++]='#';
        str2[n++]=str1[i];
    }
    str2[n]='#';
}
int solve()
{
    int max=-1;
    int i,k,p=0;
    for(i=1;i<n;i++)
    {
        if(i<p)
            a[i]=min(a[k*2-i],p-i);
        else
            a[i]=1;
        for(;str2[i+a[i]]==str2[i-a[i]];a[i]++)
            ;
        if(i+a[i]>p)
        {
            k=i;
            p=i+a[i];
        }
        if(max<a[i])
            max=a[i];
    }
    return max;
}
int main()
{
    int len,maxx,t;
    cin>>t;
    char judge[11]={'A', 'H', 'I', 'M', 'O', 'T', 'U', 'V', 'W', 'X', 'Y'};
    while(t--)
    {
       scanf("%s",str);
       len=strlen(str);
       getchar();
       maxx=-1;
       int wei=0;
       for(int i=0;i<len;i++)
       {
           int flag=0;
           for(int j=0;j<11;j++)
           if(str[i]==judge[j]) {flag=1;break;}
           if(flag==0)
           {
               str1[0]='\0';
               wei=0;
           }
           else
           {
               str1[wei]=str[i];
               wei++;
               str1[wei]='\0';
              // cout<<str1<<endl;
               memset(str2,' ',sizeof(str2));
               bian(strlen(str1));
               maxx=max(solve(),maxx);
               //cout<<maxx<<endl;
           }
       }
       /*bian(len);
       max=solve();*/
       if(maxx==-1) cout<<"0"<<endl;
       else
       printf("%d\n",maxx-1);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值