Advertisement
LinKin

palin

Feb 24th, 2012
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. /*
  2.  * Finding maximum length palindrom
  3.  * Algorithm: Manacher
  4.  * Order : linear O(n)
  5.  */
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<algorithm>
  9. using namespace std;
  10. #define MAX 1000007
  11. char Str[MAX+7];
  12. long N;             // N strlen
  13. long Odd[MAX+7];    // Odd[i]  means max length palin centered i , total length 2*Odd[i]+1
  14. long Even[MAX+7];   // Even[i] means max length palin centered i-1,i , total length 2*Even[i]
  15. void Func( void )
  16. {
  17.     long i,k,L = 0,R = -1;
  18.     for( i=0;i<N;i++ ){
  19.         if( i>R ) k = 1;
  20.         else k = min( Odd[L+R-i],R-i ) + 1;
  21.         while( i+k<N && i-k>=0 && Str[i-k]==Str[i+k] ){
  22.             k++;
  23.         }
  24.         Odd[i] = --k;
  25.         if( i+k > R ){
  26.             L = i-k;
  27.             R = i+k;
  28.         }
  29.     }
  30.     L = 0,R = -1;
  31.     Even[0] = 0;
  32.     for( i=1;i<N;i++ ){
  33.         if( i>R ) k = 1;
  34.         else k = min( Even[L+R-i+1],R-i+1 ) + 1;
  35.         while( i+k-1<N && i-k>=0 && Str[i-k]==Str[i+k-1] ){
  36.             k++;
  37.         }
  38.         Even[i] = --k;
  39.         if( i+k-1 > R ){
  40.             L = i-k;
  41.             R = i+k-1;
  42.         }
  43.     }
  44. }
  45. int main( void )
  46. {
  47.     Func();
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement