Advertisement
_rashed

POJ 3461

Jul 25th, 2022
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #define ll long long
  2. #include <iostream>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. const int OO = 1e9;
  7. const double EPS = 1e-9;
  8.  
  9. vector<int> computePrefixes(string s) {
  10.     vector<int> ret(s.length());
  11.     ret[0] = 0;
  12.     for(int i = 1, k = 0; i < s.length(); i++) {
  13.         //cout << "i = " << i << " k = " << k << "\n";
  14.         while(k > 0 && s[i] != s[k]) {
  15.             k = ret[k-1];
  16.         }
  17.         if(s[i] == s[k]) {
  18.             ret[i] = ++k;
  19.         }
  20.         else {
  21.             ret[i] = k;
  22.         }
  23.         //cout << "ret[" << i << "] is " << ret[i] << "\n";
  24.     }
  25.     return ret;
  26. }
  27.  
  28. int kmp(string W, string T) {
  29.     vector<int> pre = computePrefixes(W);
  30.     //cout << "pre is ";
  31.     //cout << "\n";
  32.     int ans = 0;
  33.     for(int i = 0, k = 0; i < T.length(); i++) {
  34.         //cout << " i = " << i << " k = " << k << "\n";
  35.         while(k > 0 && T[i] != W[k]) {
  36.             k = pre[k-1];
  37.         }
  38.         if(T[i] == W[k]) {
  39.             k++;
  40.         }
  41.         if(k == W.length()) {
  42.             ans++;
  43.             k = pre[k-1];
  44.         }
  45.     }
  46.     return ans;
  47. }
  48.  
  49. int main()
  50. {
  51.     ios_base::sync_with_stdio(NULL);
  52.     cin.tie(0);
  53.     cout.tie(0);
  54.     int t;
  55.     cin >> t;
  56.     string in;
  57.     getline(cin,in);
  58.     while(t--) {
  59.         string W,T;
  60.         getline(cin,W);
  61.         getline(cin,T);
  62.         cout << kmp(W,T) << "\n";
  63.     }
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement