Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38211 baka24 【BJ】T2 C++ 通过 100 685 MS 23720 KB 4066 2025-06-27 18:51:02

Tests(10/10):


#include<bits/stdc++.h> using namespace std; #define lson (pos<<1) #define rson (pos<<1|1) #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=500010,N=10010,base=131,Mod1=1011451423,Mod=1e9+7,Mod2=998244853; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;}int Add(int x,int y){return x+y>=Mod?x+y-Mod:x+y;} int n,m,as[MAXN],d[MAXN]; char s[MAXN]; int x[MAXN],y[MAXN],c[MAXN],sa[MAXN],rk[MAXN],ht[MAXN]; void build(){ m=131; for(int i=1;i<=n;i++)c[x[i]=s[i]]++; for(int i=1;i<=m;i++)c[i]+=c[i-1]; for(int i=1;i<=n;i++)sa[c[x[i]]--]=i; for(int k=1;k<=n;k<<=1){ int num=0; for(int i=n-k+1;i<=n;i++)y[++num]=i; for(int i=1;i<=n;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<=n;i++)c[x[i]]++; for(int i=1;i<=m;i++)c[i]+=c[i-1]; for(int i=n;i>=1;i--)sa[c[x[y[i]]]--]=y[i],y[i]=0; for(int i=1;i<=n;i++)swap(x[i],y[i]); m=x[sa[1]]=1; for(int i=2;i<=n;i++){ if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k])x[sa[i]]=m; else x[sa[i]]=++m; } if(m==n)break; } for(int i=1;i<=n;i++)rk[sa[i]]=i; for(int i=1,j=0;i<=n;i++){ if(j)j--; while(i+j<=n&&s[i+j]==s[sa[rk[i]-1]+j])j++; ht[rk[i]]=j; } } struct node{ int mn,val,sz; }; bool ty; struct segtree{ node t[MAXN<<2]; int qry(int pos,int l,int r,int x){ if(!t[pos].sz)return 0; if(l==r)return t[pos].mn<=x?t[pos].mn:x; int mid=(l+r)>>1; if(t[lson].mn<=x)return Add(qry(lson,l,mid,x),Add(t[pos].val,Mod-t[lson].val)); else return Add(qry(rson,mid+1,r,x),t[lson].sz*x%Mod); } node mrge(node x,int y,int l,int r){ node res; res.mn=min(x.mn,t[y].mn); res.sz=x.sz+t[y].sz; res.val=Add(x.val,qry(y,l,r,x.mn)); return res; } void pushup(int pos,int l,int r){ int mid=(l+r)>>1; t[pos]=mrge(t[lson],rson,mid+1,r); } void build(int pos,int l,int r){ if(l==r){ if(!ty)t[pos]={ht[l],0,0}; else t[pos]={ht[n-l+2],0,0}; return; } int mid=(l+r)>>1; build(lson,l,mid),build(rson,mid+1,r); pushup(pos,l,r); } void update(int pos,int l,int r,int x){ if(l==r){ t[pos].sz=1; t[pos].val=t[pos].mn; return; } int mid=(l+r)>>1; if(x<=mid)update(lson,l,mid,x); else update(rson,mid+1,r,x); pushup(pos,l,r); } node query(int pos,int l,int r,int x){ if(l==r)return t[pos]; int mid=(l+r)>>1; if(x<=mid){ node tmp=query(lson,l,mid,x); return mrge(tmp,rson,mid+1,r); } else return query(rson,mid+1,r,x); } }T; void slv(){ n=read(); scanf("%s",s+1); reverse(s+1,s+n+1); build(); T.build(1,1,n); for(int i=n;i>=1;i--){ if(rk[i]!=n)as[n-i+1]=T.query(1,1,n,rk[i]+1).val; T.update(1,1,n,rk[i]); } ty=1; T.build(1,1,n); for(int i=n;i>=1;i--){ if(rk[i]!=1)add(as[n-i+1],T.query(1,1,n,n-rk[i]+2).val); T.update(1,1,n,n-rk[i]+1); } for(int i=1;i<=n;i++)add(as[i],as[i-1]); for(int i=1;i<=n;i++)add(as[i],as[i-1]); for(int i=1;i<=n;i++)printf("%lld\n",as[i]); } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); // cerr<<(clock()*1.0)/CLOCKS_PER_SEC<<"s"<<endl; return 0; }


测评信息: