先上题目:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7899 Accepted Submission(s): 2703
1 #include <cstdio> 2 #include <cstring> 3 #define min(x,y) (x < y ? x : y) 4 #define MAX 110002 5 using namespace std; 6 7 char s[MAX<<1],c[MAX]; 8 int p[MAX<<1]; 9 10 int get(int &k){ 11 s[0]=‘$‘;s[1]=‘#‘; k=2; 12 while((s[k]=getchar())!=EOF) { 13 if(s[k]==‘\n‘){ 14 s[k]=‘\0‘; 15 return k; 16 } 17 s[++k]=‘#‘; 18 k++; 19 } 20 return EOF; 21 } 22 23 int main() 24 { 25 int k; 26 while(get(k)!=EOF){ 27 int mx=0,id=0; 28 if(k==2) continue; 29 //memset(p,0,sizeof(int)*(k+1)); 30 p[0]=p[1]=p[2]=0; 31 for(int i=1;i<k;i++){ 32 p[i]= mx > i ? min(p[2*id-i],mx-i) : 1; 33 while(s[i+p[i]]==s[i-p[i]]) p[i]++; 34 if(i+p[i]>mx){ 35 mx=i+p[i]; 36 id = i; 37 } 38 } 39 id=0; 40 for(int i=0;i<k;i++){ 41 if(p[id]<p[i]) id=i; 42 } 43 printf("%d\n",p[id]-1); 44 } 45 return 0; 46 }
HDU - 3068 - 最长回文,布布扣,bubuko.com
原文:http://www.cnblogs.com/sineatos/p/3892672.html