样例都过不了求调
查看原帖
样例都过不了求调
578829
wjyppm1403楼主2025/7/1 21:35
#include<bits/stdc++.h>
using namespace std;
constexpr int MN=1e6+15;
int n,k1,k2,st[MN],top,L[MN];
unsigned ans,f[MN],sum[MN][30];
string s;

namespace SA{
    int len,sa[MN],x[MN],y[MN],rk[MN],c[MN],ht[MN];

    template<typename vct>
    void getsa(vct s){
        int m=256;
        len=s.size();
        s.insert(s.begin(),' ');
        for(int i=1;i<=len;i++){
            x[i]=s[i];
            ++c[x[i]];
        }
        for(int i=1;i<=m;i++) c[i]+=c[i-1];
        for(int i=len;i>=1;i--) sa[c[x[i]]--]=i;
        for(int k=1;k<=len;k<<=1){
            int num=0;
            for(int i=len-k+1;i<=len;i++) y[++num]=i;
            for(int i=1;i<=len;i++){
                if(sa[i]>k) y[++num]=sa[i]-k;
            }
            for(int i=1;i<=m;i++) c[i]=0;
            for(int i=1;i<=len;i++) c[x[i]]++;
            for(int i=1;i<=m;i++) c[i]+=c[i-1];
            for(int i=len;i>=1;i--) sa[c[x[y[i]]]--]=y[i],y[i]=0;
            swap(x,y);
            num=1,x[sa[1]]=1;
            for(int i=2;i<=len;i++){
                if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]) x[sa[i]]=num;
                else x[sa[i]]=++num;
            }
            if(num==len) break;
            m=num;
        }
        for(int i=1;i<=len;i++) rk[sa[i]]=i;
        for(int i=1,k=0;i<=len;i++){
            if(rk[i]==1) continue;
            if(k) k--;
            int j=sa[rk[i]-1];
            while(i+k<len&&j+k<len&&s[i+k]==s[j+k]) k++;
            ht[rk[i]]=k;
        }
    }

} using namespace SA;

int calc1(int x){
    return x*(x+1)/2;
}

int calc2(int x){
    return x*(x+1)*(x-1)/3;
}

int main(){
    cin>>s>>k1>>k2;
    n=s.length();
    getsa(s);
    for(int i=1;i<=n;i++){
        int l=max(i-k1+1,1),r=min(k2,i);
        if(l<=r) f[i]=i*(calc1(r)-calc1(l-1))-(calc2(r)-calc2(l-1));
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<26;j++) sum[i][j]=sum[i-1][j];
        if(sa[i]!=1) sum[i][s[sa[i]-1]-'a']++;
    }
    for(int i=1;i<=n;i++){
        while(top&&ht[i]<ht[st[top]]){
            unsigned ret=0;
            for(int j=0;j<26;j++){
                ret+=(sum[st[top]-1][j]-sum[st[top]-L[st[top]]-1][j])*(sum[st[top]+L[i]][j]-sum[st[top]-1][j]);
            }
            ans+=f[ht[st[top]]]*((L[st[top]])*(L[i]+1)-ret);
            L[i]+=L[st[top]];
            top--;
        }
        st[++top]=i;   
        L[i]++;
    }
    while(top){
        unsigned ret=0;
        for(int j=0;j<26;j++){
            ret+=(sum[st[top]-1][j]-sum[st[top]-L[st[top]]-1][j])*(sum[st[top]+L[n+1]][j]-sum[st[top]-1][j]);
        }
        ans+=f[ht[st[top]]]*((L[st[top]])*(L[n+1]+1)-ret);
        L[n+1]+=L[st[top]];
        top--;
    }
    cout<<ans;
    return 0;
}

2025/7/1 21:35
加载中...