#include #include #include // 暴力求解 int MaxPalByForce(char* buf); // 动态规划 int MaxPalByDP(char* buf); // 中心扩展 int MaxPalByCenter(char* buf); // Manacher法 int MaxPalByMancher(char* buf); // Manacher法-精简代码 int MaxPalByMancher2(char* buf); int main(){ freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int num,i,ans; char buf[1000000]; scanf("%d\n",&num); for(i=0; ij-k+i) break; } // 是回文且长度比maxlen大 if(k>j-k+i && j-i+1>maxlen) maxlen=j-i+1; } } return maxlen; } // 动态规划 int MaxPalByDP(char* buf){ int i,j,count,index; int len=strlen(buf),maxlen=1; // 动态申请二位数组并初始化 int **dp = (int **)malloc(sizeof(int *) * len); dp[0] = (int *)malloc(sizeof(int) * len * len); for(i=1; i0; count--){ for(index=0; indexj-1 || dp[i+1][j-1]==1)){ // buf[i - j]是回文子串 dp[i][j] = 1; if(j-i+1 > maxlen) maxlen = j-i+1; } } } // 释放申请的二位数组 free(dp[0]); free(dp); return maxlen; } // 中心扩展 int MaxPalByCenter(char* buf){ int i,r; int len=strlen(buf),maxlen=1; // 回文子串的长度为奇数,即有中心 for(i=0; i-1 && i+r maxlen) maxlen = r*2-1; } // 回文子串的长度为偶数,即无中心 for(i=1; i0 && i+r maxlen) maxlen = r*2; } return maxlen; } // Manacher法 int MaxPalByMancher(char* buf){ int i,k; int id=0,mx=0,j; int len,maxlen=1; // 给字符串插入# char *newbuf=malloc(sizeof(char)*(strlen(buf)*2+1)); for(i=0; ii){ j=id*2-i; if(mx-i=0&&i+k=0&&i+kmx){ id=i; mx=radius[i]+i; } } // 从radius中查找最长回文子串的长度 for(i=0; imaxlen) maxlen=radius[i]; } free(newbuf); free(radius); return maxlen; } // Manacher法-精简代码 int MaxPalByMancher2(char* buf){ int i,k; int id=0,mx=0,j; int len,maxlen=1; // 给字符串插入# char *newbuf=malloc(sizeof(char)*(strlen(buf)*2+1)); for(i=0; ii){ if(radius[j]mx){ id=i; mx=radius[i]+i; } } // 从radius中查找最长回文子串的长度 for(i=0; imaxlen) maxlen=radius[i]; } free(newbuf); free(radius); return maxlen; }