在对奇数串和对偶数串统一处理添加新字符的时候,要用#1#2#1#
不然对于字符串abcca输出会出错
因为:
a#b#c#c#a
输出3
#a#b#c#c#a#
输出3
但是121
#1#2#1#
输出4
而1#2#1
输出3
所以还是#1#2#1#
这样最后结果都统一减一
错了好几次:
我的最后代码:(POJ3974)
#include<iostream>
#include<string>
using namespace std;
#define MAX 10000002
int max_right;//探索的最右位置
int c;//最右位置对应的下标
int p[MAX];//存放每个点对应的最长回文串
int max_r;
void solve(string s)//calculate result
{
for(int j=0;j<s.size();j++)
p[j]=1;
max_right=0;
c=0;
for(int i=0;i<s.size();i++)
{
int temp;
if(max_right>i)
{
if(c+c-i<s.size()&&p[c+c-i]>max_right-i+1)
p[i]=max_right-i+1;
else p[i]=p[c+c-i];
}
int k=p[i];
while((i-k)>=0&&(i+k)<s.size()&&s[i-k]==s[i+k])
{
p[i]++;
k++;
}
if(i+p[i]-1>max_right)
{
max_right=i+p[i]-1;
c=i;
}
if(p[i]>max_r)
{
max_r=p[i];
}
// cout<<p[i]<<endl;
}
}
string g(string ss)//预处理
{
string r;
for(int v=0;v<ss.size();v++)
{
r+='#';
r+=ss[v];
}
r+='#';
return r;
}
int main(void)
{
string temp;
int a=1;
int max_c;
while(cin>>temp)
{
if(temp=="END")
break;
max_r=0;
string temp2;
temp2=g(temp);
solve(temp2);//return result
cout<<"Case "<<a<<": "<<max_r-1<<endl;
a++;
}
return 0;
}