Untitled
// ThonqRiu #include <bits/stdc++.h> #define endl '\n' #define maxn 200005 #define MOD 1000000007 #define Task "bai1" #define ll long long using namespace std; string A,B; int n,base = 131; ll M2 = 1ll*MOD * MOD; ll sumA[maxn],sumB[maxn],p[maxn]; unordered_set<ll> s; ll get_hashA(int L,int R){ return (sumA[R] - sumA[L-1]*p[R-L+1] + M2); } ll get_hashB(int L,int R){ return (sumB[R] - sumB[L-1]*p[R-L+1] + M2); } bool check(int l){ s.clear(); for(int i = 1; i<= n - l + 1; i++) // n = 12 s.insert(get_hashA(i,i+l-1)); for(int i = 1; i<= n - l + 1; i++) if(s.find(get_hashB(i,i+l-1)) != s.end()) return 1; return 0; } int main() { ios_base:: sync_with_stdio(0); cin.tie(nullptr); if(fopen(Task".inp","r")){ freopen(Task".inp","r",stdin); } cin >> A; cin >> B; n = 2*A.length(); A = " " + A + A; B = " " + B + B; p[0] = 1; for(int i = 1; i<=n; i++){ sumA[i] = (sumA[i-1]*base + A[i]); sumB[i] = (sumB[i-1]*base + B[i]); p[i] = (p[i-1]*base); } int L = 1; int R = n/2+1; while(R - L > 1){ int mid = (R + L) / 2; if(check(mid)) L = mid; else R = mid; } cout << L; }
Leave a Comment