(manacher算法) poj 3974
Time Limit: 15000MS | Memory Limit: 65536K | |
Total Submissions: 5193 | Accepted: 1867 |
Description
A string is said to be a palindrome if it reads the same both forwards and backwards, for example "madam" is a palindrome while "acm" is not.
The students recognized that this is a classical problem but couldn‘t come up with a solution better than iterating over all substrings and checking whether they are palindrome or not, obviously this algorithm is not efficient at all, after a while Andy raised his hand and said "Okay, I‘ve a better algorithm" and before he starts to explain his idea he stopped for a moment and then said "Well, I‘ve an even better algorithm!".
If you think you know Andy‘s final solution then prove it! Given a string of at most 1000000 characters find and print the length of the largest palindrome inside this string.
Input
Output
Sample Input
abcbabcbabcba abacacbaaaab END
Sample Output
Case 1: 13 Case 2: 6
就是求最长回文串。。。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<cstdlib> #include<queue> #include<vector> #include<set> #include<stack> #include<queue> using namespace std; int p[2000005],len,cas; char s[2000005],str[1000005]; void build() { s[0]=‘@‘; s[1]=‘#‘; len=strlen(str); for(int i=0;i<len;i++) { s[2*i+2]=str[i]; s[2*i+3]=‘#‘; } s[2*len+2]=‘\0‘; } void solve() { int mx=0,id,ans=1; len=2*len+2; for(int i=0;i<len;i++) { if(mx>i) p[i]=min(mx-i,p[2*id-i]); else p[i]=1; for(;s[i-p[i]]==s[i+p[i]];p[i]++) { if(i+p[i]>mx) { mx=i+p[i]; id=i; } } ans=max(ans,p[i]); } printf("Case %d: %d\n",++cas,ans-1); } int main() { while(scanf("%s",str)!=EOF) { if(strcmp(str,"END")==0) break; build(); solve(); } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。