最长回文字串--------注意一个小点-----添加字符的问题

在对奇数串和对偶数串统一处理添加新字符的时候,要用#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;
}

你可能感兴趣的:(最长回文字串--------注意一个小点-----添加字符的问题)