标签:case ret alt aaa using lin 包含 lock out
Description
Input
Output
Sample Input
aaaa abab
Sample Output
4 3
题意:中文题目不解释
思路:直接套用manachar算法返回结果即为最长回文串的长度
算法模板:
1 int manachar(int len) 2 { 3 int maxn,mx,id; 4 maxn=mx=id=0; 5 memset(p,0,sizeof(p)); 6 for(int i=1;i<len;i++) 7 { 8 if(mx>i) 9 p[i]=min(p[id*2-i],mx-i);//manachar算法的核心所在 10 else 11 p[i]=1; 12 for(;str[i-p[i]]==str[i+p[i]];p[i]++) 13 { 14 if(p[i]+i>mx) 15 { 16 mx=p[i]+i; 17 id=i; 18 } 19 } 20 maxn=max(p[i],maxn); 21 } 22 return maxn-1; 23 }
AC代码:
1 #include <iostream> 2 #include<cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 char s[110005],str[300000]; 8 int p[300000]; 9 int manachar(int len) 10 { 11 int maxn,mx,id; 12 maxn=mx=id=0; 13 memset(p,0,sizeof(p)); 14 for(int i=1;i<len;i++) 15 { 16 if(mx>i) 17 p[i]=min(p[id*2-i],mx-i); 18 else 19 p[i]=1; 20 for(;str[i-p[i]]==str[i+p[i]];p[i]++) 21 { 22 if(p[i]+i>mx) 23 { 24 mx=p[i]+i; 25 id=i; 26 } 27 } 28 maxn=max(p[i],maxn); 29 } 30 printf("%d\n",maxn-1); 31 return 0; 32 } 33 int main() 34 { 35 while(~scanf("%s",s)) 36 { 37 str[0]=‘$‘,str[1]=‘#‘; 38 int len=strlen(s); 39 for(int i=0;i<len;i++) 40 { 41 str[i*2+2]=s[i]; 42 str[i*2+3]=‘#‘; 43 } 44 str[len*2+2]=‘\0‘; 45 manachar(len*2+2); 46 } 47 return 0; 48 }
标签:case ret alt aaa using lin 包含 lock out
原文地址:http://www.cnblogs.com/wang-ya-wei/p/6123428.html