Palindrome
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.
abcbabcbabcba abacacbaaaab END
Case 1: 13 Case 2: 6
Manacher算法用于求最长回文子串:Manacher算法详解
code:
#include <iostream>
#include <cstring>
#include <cstdio>
#define MAXN 1000005
using namespace std;
char s[MAXN];
char New[MAXN<<1];
int p[MAXN<<1];
int getNew(int len){
int t = 0;
New[t++] = 1;
int i;
for(i = 0; i < len; i++){
New[t++] = s[i];
New[t++] = 1;
}
return t;
}
int manacher(int len){
int mx = 0,po = 0,ans = 0;
int i;
for(i = 0; i < len; i++){
if(i < mx)
p[i] = min(mx-i,p[2*po-i]);
else
p[i] = 1;
while(New[i-p[i]] == New[i+p[i]] && i-p[i] >= 0 && i+p[i] < len){
p[i]++;
}
if(i+p[i] > mx){
mx = i+p[i];
po = i;
}
ans = max(ans,p[i]-1);
}
return ans;
}
int main(){
int cas = 0;
while(~scanf("%s",s)){
if(strcmp(s,"END") == 0)
break;
printf("Case %d: ",++cas);
int len = strlen(s);
len = getNew(len);
printf("%d\n",manacher(len));
}
return 0;
}
5295



被折叠的 条评论
为什么被折叠?



