题解:
要求文中要求的字符串,输出最长的长度。首先要看数据范围,字符串长度最多200,所以显然可以暴力,我用的就是暴力,枚举中间的长度,之后找前面的一半,和后面的另一半,最后在判断2个是否都回文,最后更新出最大值就行了。(PS:其实也可以不用求是否回文,只要前半部分和后半部分相等就可以了,但刷的时候没想到)
AC代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <string>
#include <cassert>
#include <climits>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define prN printf("\n")
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
string a;
int save[205];
int judge(int in1,int in2)
{
int len=in2-in1+1;
int fl=0;
if (len&1)
{
int mid=(in1+in2)/2;
int s=mid-1,e=mid+1;
while(a[s]==a[e]&&s>=in1&&e<=in2)
{
s--,e++;
}
if (s==in1-1&&e==in2+1)
return 1;
else return 0;
}
else
{
int mid=(in1+in2)/2;
int s=mid,e=mid+1;
while(a[s]==a[e]&&s>=in1&&e<=in2)
{
s--,e++;
}
if (s==in1-1&&e==in2+1)
return 1;
else return 0;
}
}
int main()
{
int o;
cin>>o;
while (o--)
{
cle(save,0);
cin>>a;
int len=a.size();
int ans=0;
for (int i=1; i<=len-2; i++)
{
for (int j=1; j<=len-3; j++)
{
if (i-j<0||i+2*j-1>=len)
break;
else
{
int a=i-j,b=i+j-1,c=i+2*j-1;
int f1=judge(a,b);
int f2=judge(i,c);
if (f1&&f2)
{
ans=max(3*j,ans);
}
}
}
}
printf("%d\n",ans);
}
return 0;
}