class CManacher:public CTest
{
string GetManacher(const string str)
{
string strTmp;
string result="";
int *p=new int[2*str.size()+1];
int i;
strTmp+='#';
int j=1;
for(i=0;i<str.size();i++)
{
strTmp+=str[i];
strTmp+='#';
}
int id=0,max=0;
p[0]=1;
cout<<strTmp.c_str()<<endl;
bool search=false;
for(i=1;i<strTmp.size();i++)
{
j=2*id-i;
if(j>=0)
{
if(i<max)
{
if(p[j]<=max-i+1)
{
p[i]=p[j];
}
else
{
p[i]=max-i+1;
search=true;
}
}
else
{
p[i]=1;
search=true;
}
}
else
{
p[i]=1;
search=true;
}
if(search)
{
search=false;
while(strTmp[i-p[i]]==strTmp[i+p[i]])p[i]++;
}
if(i+p[i]-1>max)
{
max=i+p[i]-1;
id=i;
}
}
max=0;
id=0;
for(i=0;i<strTmp.size();i++)
{
if(p[i]>max)
{
max=p[i];
id=i;
}
}
for(int i=id-p[id]+1;i<=id+p[id]-1;i++)
{
if(strTmp[i]!='#')
{
result+=strTmp[i];
}
}
//cout<<result.c_str()<<endl;
delete []p;
return result;
}
public:
void Test()
{
string str = "12212321";
string res=GetManacher(str);
cout<<res.c_str()<<endl;
}
};
};