Untitled

 avatar
unknown
plain_text
a month ago
1.9 kB
3
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;
            }
Leave a Comment