1、http://acm.hdu.edu.cn/showproblem.php?pid=3068
超时错在用了好几次strlen(),改正方法int n=strlen();再次调用时用常量就可以不超时
2、题目大意:
给定一个字符串,只含有小写字母,求最长回文子串的长度,最简单的求回文子串的题目,
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4275 Accepted Submission(s): 1417
aaaa abab
4 3
3、代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxx 20000050 char str[2*maxx]; char s[maxx]; int p[maxx]; void Manacher(int *p,char *str,int len) { int mx=0; int idx=0; for(int i=1; i<len; i++) { p[i]=mx>i?min(p[2*idx-i],mx-i):1; while(str[i+p[i]]==str[i-p[i]]) p[i]++; if(i+p[i]>mx) { mx=i+p[i]; idx=i; } } } int main() { while(scanf("%s",s)!=EOF) { int nn=strlen(s);//需要定义一个变量nn,如果每次调用strlen(s),时间就会长 int n=2*nn+2; str[0]='$'; for(int i=0; i<=nn; i++) { str[2*i+1]='#'; str[2*i+2]=s[i]; } Manacher(p,str,n); int ans=1; for(int i=0; i<n; i++) ans=max(ans,p[i]); printf("%d\n",ans-1); } return 0; } /* aaaa abab */