1 solutions

  • 0
    @ 2025-2-8 13:09:32
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e6+5;
    const int p=998244353;
    typedef long long ll;
    typedef unsigned long long ull;
    const int M=2;
    const ull B=233,mod[M]={1000000009,1000000901};
    ull pw[M][N];
    
    void init()
    {
        for(int j=0;j<M;++j)
        {
            pw[j][0]=1;
            for(int i=1;i<N;++i)
                pw[j][i]=pw[j][i-1]*B%mod[j];
        }
    }
    // h[i]表示s_{0,1,...,i-1}的哈希值
    void initHash(string &s,vector<vector<int>> &h)
    {
        h.resize(M);
        for(int j=0;j<M;++j)
        {
            h[j].resize(s.size()+1);
            h[j][0]=0;
            for(int i=0;i<(int)s.size();++i)
                h[j][i+1]=(h[j][i]*B+s[i]-'a'+1)%mod[j];
        }
    }
    array<ull,M> subHash(vector<vector<int>> &h,int l,int r)
    {
        array<ull,M> res;
        for(int i=0;i<M;++i)
            res[i]=(h[i][r]+mod[i]-h[i][l-1]*pw[i][r-l+1]%mod[i])%mod[i];
        return res;
    }
    string s,t;
    vector<vector<int>> hs,ht;
    int lcp[N];
    ll f[N][3],diff[N][3];
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        init();
        cin>>s>>t;
        initHash(s,hs),initHash(t,ht);
        int n=(int)s.size(),m=(int)t.size();
        for(int i=1;i<=n;i++)
        {
            int ans=0,mid,l=1,r=min(m,n-i+1);
            while(l<=r)
            {
                mid=(l+r)>>1;
                if(subHash(hs,i,i+mid-1)==subHash(ht,1,mid))
                {
                    ans=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }
            lcp[i]=ans;
            if(lcp[i]==min(n-i+1,m)) continue;
            ans=0,l=1,r=min(m,n-i+1)-lcp[i]-1;
            while(l<=r)
            {
                mid=(l+r)>>1;
                if(subHash(hs,i+lcp[i]+1,i+mid+lcp[i])==subHash(ht,1+lcp[i]+1,mid+lcp[i]+1))
                {
                    ans=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }
            lcp[i]+=ans+1;
        }
        f[n+1][0]=1;
        for(int i=n;i;i--)
        {
            int l=i+1,r=i+lcp[i];
            f[i][0]=(f[l][0]-f[r+1][0]+p)%p;
            f[i][1]=((f[l][1]-f[r+1][1]+p)+(f[l][0]-f[r+1][0]+p))%p;
            f[i][2]=((f[l][2]-f[r+1][2]+p)+2*(f[l][1]-f[r+1][1]+p)+(f[l][0]-f[r+1][0]+p))%p;
            f[i][0]=(f[i][0]+f[i+1][0])%p;
            f[i][1]=(f[i][1]+f[i+1][1])%p;
            f[i][2]=(f[i][2]+f[i+1][2])%p;
        }
        cout<<(f[1][2]-f[2][2]+p)%p<<'\n';
        return 0;
    }
    
    • 1

    Information

    ID
    9312
    Time
    6000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    23
    Accepted
    1
    Uploaded By