回文_Manacher算法
生活随笔
收集整理的這篇文章主要介紹了
回文_Manacher算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法簡介:算法的目的是在O(n)的時間復雜度內找到一個字符串中各個字母所在的最大長度的回文串。
此算法用到了一個Rad[]數組的定義,Rad[i]表示回文的半徑,即最大的j滿足str[i-j+1...i] = str[i+1...i+j]。
我們的工作就是把全部的Rad[]求出來。
有兩個結論:
?(1):?對于一個整數k,如果 (1<=k<=Rad[i] && Rad[i-k] < Rad[i]-k ) 那么,?Rad[i+k] = min( Rad[i-k], Rad[i]-k ).
(2) : ?對于一個整數k,如果 (1<=k<=Rad[i] && Rad[i-k] > Rad[i]-k ) 那么,?Rad[i+k] = min( Rad[i-k], Rad[i]-k ).
參考http://www.starvae.com/?p=212
模版:參考poj3974
View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <string> 5 using namespace std; 6 //13400K 485MS 7 const int maxnum=2000005; 8 int rad[maxnum]; 9 10 int manacher(char *str) 11 { 12 memset(rad,0,sizeof(rad)); 13 string s; 14 int n=strlen(str); 15 int ans=0; 16 int i,j,k; 17 for(i=0;i<n;i++) 18 { 19 s+='#'; 20 s+=str[i]; 21 } 22 s+='#'; 23 n=(n<<1)+1; 24 i=0; 25 j=1; 26 while(i<n) 27 { 28 while(i-j>=0 && i+j<n && s[i-j]==s[i+j]) 29 j++; 30 rad[i]=j-1; 31 k=1; 32 while(k<=rad[i] && rad[i]-k!=rad[i-k]) 33 { 34 rad[i+k]=min(rad[i-k],rad[i]-k); 35 k++; 36 } 37 i+=k; 38 j=max(j-k,0); 39 } 40 for(i=0;i<n;i++) 41 ans=max(ans,rad[i]); 42 return ans; 43 } 44 45 int main() 46 { 47 int num=1; 48 char str[maxnum]; 49 while(scanf("%s",str)!=EOF) 50 { 51 if(strcmp(str,"END")==0) 52 break; 53 else 54 { 55 printf("Case %d: ",num++); 56 printf("%d\n",manacher(str)); 57 } 58 } 59 return 0; 60 }?
轉載于:https://www.cnblogs.com/pushing-my-way/archive/2012/08/26/2657516.html
總結
以上是生活随笔為你收集整理的回文_Manacher算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wincc 报警记录 mysql_如何才
- 下一篇: 概率论与数理统计1:启航