Pabon_SEC

Secret Word

Apr 12th, 2016
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define sz 1000005
  3.  
  4. using namespace std;
  5.  
  6. int prefix[sz];
  7.  
  8. char rev[sz],text[sz];
  9.  
  10. int len;
  11.  
  12. void compute_prefix()
  13. {
  14.     int i,j=0;
  15.  
  16.     prefix[1] = 0;
  17.  
  18.     for(i=2; i<=len; i++)
  19.     {
  20.         while(j && rev[j+1]!=rev[i])
  21.         {
  22.             j = prefix[j];
  23.         }
  24.  
  25.         if(rev[j+1]==rev[i])
  26.         {
  27.             j++;
  28.         }
  29.  
  30.         prefix[i] = j;
  31.     }
  32. }
  33.  
  34. int KMP_match()
  35. {
  36.     int i,j=0;
  37.  
  38.     int mx = 0;
  39.  
  40.     for(i=1; i<=len; i++)
  41.     {
  42.         while(j && text[j+1]!=rev[i])
  43.         {
  44.             j = prefix[j];
  45.         }
  46.  
  47.         if(text[j+1]==rev[i])
  48.         {
  49.             j++;
  50.         }
  51.  
  52.         mx = max(mx,j);
  53.  
  54.         if(j==len)
  55.         {
  56.             j = prefix[j];
  57.         }
  58.     }
  59.  
  60.     return mx;
  61. }
  62.  
  63. int main()
  64. {
  65.     int test,i,index;
  66.  
  67.     scanf("%d",&test);
  68.  
  69.     while(test--)
  70.     {
  71.         scanf("%s",rev+1);
  72.  
  73.         strcpy(text+1,rev+1);
  74.  
  75.         len = strlen(text+1);
  76.  
  77.         compute_prefix();
  78.  
  79.         reverse(rev+1,rev+len+1);
  80.  
  81.         index = KMP_match();
  82.  
  83.         for(i=index;i>0;i--)
  84.         {
  85.             printf("%c",text[i]);
  86.         }
  87.  
  88.         puts("");
  89.  
  90.     }
  91.  
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment