Advertisement
Sonveer

PERIOD SPOJ

May 25th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.98 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. void KMP_MATCHER(string,int);
  5. void Compute_prefix(int [],string ,int);
  6. int main(void)
  7. {
  8.     int T,n,i=1;
  9.     string P;
  10.     scanf("%d",&T);
  11.     while(T--)
  12.     {
  13.         cin>>n>>P;
  14.         printf("Test case #%d\n",i);
  15.         i++;
  16.         KMP_MATCHER(P,n);
  17.         printf("\n");
  18.     }
  19.         return 0;
  20. }
  21. void KMP_MATCHER(string P,int z)
  22. {
  23.     int q,i,n,m;
  24.     m=z;
  25.     int PHI[m];
  26.     Compute_prefix(PHI,P,m);
  27.  //   for(i=1;i<=m;i++) printf("%d ",PHI[i]);
  28.     for(i=2;i<=m;i++)
  29.         if(i%(i-PHI[i])==0)
  30.         {
  31.             n=i/(i-PHI[i]);
  32.             if(n!=1)
  33.             printf("%d %d\n",i,n);
  34.         }
  35.     return;
  36. }
  37. void Compute_prefix(int PHI[],string P,int m)
  38. {
  39.     PHI[0]=0;
  40.     PHI[1]=0;
  41.     int q,k=0;
  42.     for(q=2;q<=m;q++)
  43.     {
  44.         while(k>0&&P.at(k)!=P.at(q-1))
  45.             k=PHI[k];
  46.         if(P.at(k)==P.at(q-1))
  47.             k=k+1;
  48.         PHI[q]=k;
  49.     }
  50.     return;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement