Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11771 Accepted Submission(s): 4315
aaaa abab
4 3
思路:Manacher算法模板;
对于算法的学习请点击:>>Manacher<<
转载请注明出处:寻找&星空の孩子
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 110010*2 int P[maxn]; //(p.s. 可以看出,P[i]-1正好是原字符串中回文串的总长度) char s1[maxn]; char s2[maxn]; void manacher(char* s) { int i,id=0,mx=0; P[0]=0; //P[0]位置没用 for(i=1;s[i];i++) //对串进行线性扫描 { if(mx > i) //如果mx比当前i大,分为两种情况,详细致请看文章开头推荐的blog上的图示,非常给力的图 P[i] = min(P[2*id-i],mx-i); else //如果mx比i小,没有可以利用的信息,那么就只能从头开始匹配 P[i] = 1; while(s[i+P[i]]==s[i-P[i]] )P[i]++; //匹配 if(mx < P[i] + i) //坚持是否有更新mx以及id { mx = P[i] + i; id = i; } } } void init() { int i, j = 2; s2[0] = '$', s2[1] = '#'; for(i=0;s1[i];i++) { s2[j++] = s1[i]; s2[j++] = '#'; } s2[j] = '\0'; } int main() { while(scanf("%s",s1)!=EOF) { init(); manacher(s2); int ans=0; for(int i=1;s2[i]!='\0';i++) { ans=max(ans,P[i]); } printf("%d\n",ans-1); } return 0; }
Time Limit: 15000MS | Memory Limit: 65536K | |
Total Submissions: 5868 | Accepted: 2128 |
Description
Input
Output
Sample Input
abcbabcbabcba abacacbaaaab END
Sample Output
Case 1: 13 Case 2: 6
Source
题目链接:http://poj.org/problem?id=3974
同上题一样。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 1000010*2 int P[maxn]; //(p.s. 可以看出,P[i]-1正好是原字符串中回文串的总长度) char s1[maxn]; char s2[maxn]; void manacher(char* s) { int i,id=0,mx=0; P[0]=0; //P[0]位置没用 for(i=1;s[i];i++) //对串进行线性扫描 { if(mx > i) //如果mx比当前i大,分为两种情况,详细致请看文章开头推荐的blog上的图示,非常给力的图 P[i] = min(P[2*id-i],mx-i); else //如果mx比i小,没有可以利用的信息,那么就只能从头开始匹配 P[i] = 1; while(s[i+P[i]]==s[i-P[i]] )P[i]++; //匹配 if(mx < P[i] + i) //坚持是否有更新mx以及id { mx = P[i] + i; id = i; } } } void init() { int i, j = 2; s2[0] = '$', s2[1] = '#'; for(i=0;s1[i];i++) { s2[j++] = s1[i]; s2[j++] = '#'; } s2[j] = '\0'; } int main() { int ca=1; while(scanf("%s",s1)!=EOF) { if(strcmp(s1,"END")==0) return 0; init(); manacher(s2); int ans=0; for(int i=1;s2[i]!='\0';i++) { ans=max(ans,P[i]); } printf("Case %d: %d\n",ca++,ans-1); } return 0; } /* abcbabcbabcba abacacbaaaab END */