#include <iostream>
using namespace std;
class Solution
{
public:
int manacher(string str)
{
if(str.size()<1) return 0;
string new_str="";
manacher(str,new_str);
int length=new_str.size();
int* pA=new int[length]();
int index=-1;
int pR=-1;
int max_length=-1;
for(int i=0;i<length;i++)
{
pA[i]=pR>i?min(pA[2*index-i],pR-i):1;
while(i-pA[i]>-1 && i+pA[i]<length)
{
if(new_str[i-pA[i]]!=new_str[i+pA[i]])
{
break;
}
pA[i]++;
}
if(i+pA[i]>pR)
{
pR=i+pA[i];
index=i;
}
max_length=max(max_length,pA[i]);
}
delete[] pA;
return max_length-1;
}
private:
void manacher(string str,string& new_str)
{
for(int i=0;i<str.size();i++)
{
new_str.push_back('#');
new_str.push_back(str[i]);
}
new_str.push_back('#');
}
};
class Solution2
{
public:
string shortestEnd(string str)
{
if(str.size()<1) return "";
string new_str;
shortestEnd(str,new_str);
int length=new_str.size();
int* pA=new int[length]();
int index=-1;
int pR=-1;
int lastR=-1;
for(int i=0;i<length;i++)
{
pA[i]=pR>i?min(pA[2*index-i],pR-i):1;
while(i-pA[i]>-1 && i+pA[i]<length)
{
if(new_str[i-pA[i]]!=new_str[i+pA[i]])
{
break;
}
pA[i]++;
}
if(i+pA[i]>pR)
{
pR=i+pA[i];
index=i;
}
if(pR==length)
{
lastR=i;
break;
}
}
string result="";
int re_len=2*lastR-length;
for(int i=re_len;i>0;i-=2)
{
result.push_back(new_str[i]);
}
delete[] pA;
return result;
}
private:
void shortestEnd(string str,string& new_str)
{
for(int i=0;i<str.size();i++)
{
new_str.push_back('#');
new_str.push_back(str[i]);
}
new_str.push_back('#');
}
};
int main()
{
string str1="abcd123321";
Solution2 ss;
cout<<ss.shortestEnd(str1)<<endl;
return 0;
}