Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 500007
- using namespace std;
- int z[MAX], zsz;
- vector<int> g[MAX];
- void func(string s){
- memset(z, 0, sizeof z);
- zsz = s.size();
- int l = 0, r = 0;
- for(int i = 1; i < s.size(); i++){
- z[i] = max(0, min(z[i-l], r-i+1));
- while(i+z[i] < s.size() && s[z[i]] == s[i+z[i]]){
- l = i; r = i+z[i]; z[i]++;
- }
- }
- z[0] = s.size();
- }
- char st[MAX];
- int main(){
- scanf(" %s", st);
- string s(st);
- int n = s.size();
- scanf(" %s", st);
- int m = t.size();
- string t(st);
- func(t + "$" + s);
- for(int i = m; i < zsz; i++){
- if(z[i] == 0) continue;
- g[z[i]].push_back(i+z[i]-1);
- }
- reverse(s.begin(), s.end());
- reverse(t.begin(), t.end());
- func(t + "$" + s);
- int dist = 0;
- for(int i = m; i < zsz; i++){
- if(z[i] == 0) continue;
- int comp = m-z[i];
- int r_idx = (n-1)-(i-m);
- if(g[comp][g[comp.size()-1] < r_idx) dist = max(dist, (n-r_idx)+g[comp][g[comp.size()-1]+1);
- else dist = max(dist, g[comp][g[comp.size()-1]-r_idx+1);
- int p = lower_bound(g[comp].begin(), g[comp].end(), r_idx) - g[comp].begin();
- p--;
- if(p < 0) continue;
- dist = max(dist, (n-r_idx)+g[comp][p]+1);
- }
- printf("%d\n", dist);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement