Untitled
unknown
plain_text
10 months ago
1.9 kB
6
Indexable
// 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;
}
Editor is loading...
Leave a Comment