Advertisement
prakharvk

KMP string matching

Aug 6th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int* maxPS(string st){
  5.     int n=st.size();
  6.     int len=0;
  7.     int ans=0;
  8.     int i=1;
  9.     int *lps=new int[n];
  10.     lps[0]=0;
  11.     while(i<n){
  12.         if(st[i]==st[len]){
  13.             len++;
  14.             lps[i]=len;
  15.             ans=max(ans,lps[i]);
  16.             i++;
  17.         }
  18.         else{
  19.             if(len!=0){
  20.                 len=lps[len-1];
  21.             }
  22.             else{
  23.                 lps[i]=0;
  24.                 i++;
  25.             }
  26.         }
  27.     }
  28.     // for(int i=0;i<n;i++){
  29.     //     cout<<lps[i]<<" ";
  30.     // }
  31.     return lps;
  32. }
  33. int main()
  34.  {
  35.     int t;
  36.     cin>>t;
  37.     while(t--){
  38.         string text;
  39.         cin>>text;
  40.         string st;
  41.         cin>>st;
  42.         int *lps=maxPS(st);
  43.         int j=0;
  44.         int i=0;
  45.         int n=text.size();
  46.         int m=st.size();
  47.         while(i<n){
  48.             if(text[i]==st[j]){
  49.                 i++;
  50.                 j++;
  51.             }
  52.             else{
  53.                 if(j!=0){
  54.                     j=lps[j-1];
  55.                 }
  56.                 else{
  57.                     i++;
  58.                 }
  59.             }
  60.             if(j==m){
  61.                 cout<<i-m<<" "<<st<<endl;
  62.             }
  63.         }
  64.    
  65.     }
  66.     return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement