这个题的数据量不太大,直接暴力就能过。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
const int maxn = 1e5;
char str[1005];
int judge(int l,int r)
{
char *q,*p;
int flag=1;
q = str+l;
p = str+r;
while(p>=q)
{
if(*p==*q)
{
p--;
q++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int len;
fgets(str,1005,stdin);
len = strlen(str)-1;
int ans = 0;
if(len == 1)
{
cout<<1<<endl;
}
else
{
for(int i=0; i<len; i++)
{
for(int j=i+1; j<len; j++)
{
if(str[j] == str[i])
{
if(judge(i,j))
{
ans = max(ans,j-i+1);
}
}
}
}
if(ans!=0)
cout<<ans<<endl;
else//全不对称,例如 abcd
cout<<1<<endl;
}
return 0;
}
最近刚学了Manacher算法,正好拿这个题练练手。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
const int maxn = 1e5;
char str[1005*4];
string s;
int len,p[1005*4];
void add()
{
s = "";
s+='&';
for(int i=0; i<len; i++)
{
s+='#';
s+=str[i];
}
s+='#';
s+='@';
}
void manacher()
{
int r=0,mid=0;
for(int i=1; i<s.size()-1; i++)
{
p[i] = r>i?min(p[2*mid-i],r-i):1;
while(s[i+p[i]] == s[i-p[i]])
p[i]++;
if(i+p[i]>r)
{
r = i+p[i];
mid = i;
}
}
}
int main()
{
fgets(str,1005,stdin);
len = strlen(str)-1;
int ans = 0;
memset(p,0,sizeof(p));
if(len == 1)
{
cout<<1<<endl;
}
else
{
add();
manacher();
for(int i=1; i<s.size()-1; i++)
{
ans = max(ans,p[i]);
}
cout<<ans-1<<endl;
}
return 0;
}