Advertisement
Manioc

zuadadn

Sep 25th, 2019
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 500007
  3.  
  4. using namespace std;
  5.  
  6. int z[MAX], zsz;
  7.  
  8. vector<int> g[MAX];
  9. void func(string s){
  10.     memset(z, 0, sizeof z);
  11.     zsz = s.size();
  12.     int l = 0, r = 0;
  13.     for(int i = 1; i < s.size(); i++){
  14.         z[i] = max(0, min(z[i-l], r-i+1));
  15.         while(i+z[i] < s.size() && s[z[i]] == s[i+z[i]]){
  16.             l = i; r = i+z[i]; z[i]++;
  17.         }
  18.     }
  19.     z[0] = s.size();
  20. }
  21.  
  22. char st[MAX];
  23. int main(){
  24.     scanf(" %s", st);
  25.     string s(st);
  26.     int n = s.size();
  27.  
  28.     scanf(" %s", st);
  29.     int m = t.size();
  30.  
  31.     string t(st);
  32.     func(t + "$" + s);
  33.  
  34.     for(int i = m; i < zsz; i++){
  35.         if(z[i] == 0) continue;
  36.         g[z[i]].push_back(i+z[i]-1);
  37.     }
  38.  
  39.     reverse(s.begin(), s.end());
  40.     reverse(t.begin(), t.end());
  41.     func(t + "$" + s);
  42.     int dist = 0;
  43.     for(int i = m; i < zsz; i++){
  44.         if(z[i] == 0) continue;
  45.  
  46.         int comp = m-z[i];
  47.         int r_idx = (n-1)-(i-m);
  48.  
  49.         if(g[comp][g[comp.size()-1] < r_idx) dist = max(dist, (n-r_idx)+g[comp][g[comp.size()-1]+1);
  50.         else dist = max(dist, g[comp][g[comp.size()-1]-r_idx+1);
  51.  
  52.         int p = lower_bound(g[comp].begin(), g[comp].end(), r_idx) - g[comp].begin();
  53.         p--;
  54.         if(p < 0) continue;
  55.         dist = max(dist, (n-r_idx)+g[comp][p]+1);
  56.     }
  57.  
  58.     printf("%d\n", dist);
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement