manacher最长回文序列c++
#include <iostream> #include<string> #include<cstring> using namespace std; char * pre(char *str) { int length = strlen(str); char *prestr = new char[2*length + 4]; prestr[1] = '$'; for(int i=0;i<length;i++) { prestr[2*(i+1)] = '#'; prestr[2*(i+1)+1] = str[i]; } prestr[2*length+2]='#'; prestr[2*length+3]='\0'; return prestr; } int getMaxSym3(char *str) { char *prestr = pre(str); int mx =0, pi=1;//边界和对称中心 int len = strlen(prestr); //辅助数组 int *p = new int[len]; p[0] = 0; for(int i=1;i<len;i++) { if(mx>i) { p[i]=min(mx-i,p[2*pi-i]);//核心 } else { p[i]=1; } while(prestr[i-p[i]]==prestr[i+p[i]]&&i-p[i]>0&&i+p[i]<len) { p[i]++; } if(i+p[i] > mx) { mx = p[i] + i; pi = i; } } //最大回文字符串长度 int maxlen = 0; for(int i=0;i<len;i++) { if(p[i]>maxlen) { maxlen = p[i]; } } delete []prestr; delete []p; return maxlen - 1; } int main() { string str="sdghfjkghkdfjdfghjklkjhgfdsawtery"; int m=str.length(); char arr[m]; for(int i=0;i<m;i++) { arr[i]=str[i]; } int counts=getMaxSym3(arr); cout<<counts<<endl; return 0; }