QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#560006#9244. Counting StringsLarunatrecyWA 2ms26280kbC++144.4kb2024-09-12 11:23:132024-09-12 11:23:13

Judging History

This is the latest submission verdict.

  • [2024-09-12 11:23:13]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 26280kb
  • [2024-09-12 11:23:13]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
template <typename T>inline void read(T &x)
{
    x=0;char c=getchar();bool f=0;
    for(;c<'0'||c>'9';c=getchar())f|=(c=='-');
    for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c-'0');
    x=(f?-x:x);
}
const int N = 2e5+7;
int n;
char s[N];
int tot=1,last=1;
int tr[N][26],len[N],fa[N],pos[N];
void copy(int x,int y)
{
    len[x]=len[y];
    fa[x]=fa[y];
    for(int c=0;c<26;c++)
    tr[x][c]=tr[y][c];
}
void extend(int x,int c)
{
    int p=last,np=last=++tot;
    pos[x]=np;
    len[np]=len[p]+1;
    while(p&&!tr[p][c])
    {
        tr[p][c]=np;
        p=fa[p];
    }
    if(!p)fa[np]=1;
    else
    {
        int q=tr[p][c];
        if(len[q]==len[p]+1)fa[np]=q;
        else
        {
            int nq=++tot;
            copy(nq,q);
            fa[np]=fa[q]=nq;
            len[nq]=len[p]+1;
            while(p&&tr[p][c]==q)
            {
                tr[p][c]=nq;
                p=fa[p];
            }
        }
    }
}
int prime[N],cnt=0,v[N];
int vis[N];
int C=0;
int dfn[N],seq[N],tim=0;
vector<int> G[N];
int st[20][N],dep[N];
void dfs(int x)
{
    dep[x]=dep[fa[x]]+1;
    seq[dfn[x]=++tim]=x;
    for(int y:G[x])
    {
        dfs(y);
    }
}
int lg[N];
inline int Min(int x,int y)
{
    return dep[x]<dep[y]?x:y;
}
inline int Max(int x,int y)
{
    if(!x||!y)return x+y;
    return dep[x]<dep[y]?y:x;
}
void build()
{
    dfs(1);
    for(int i=2;i<=tot;i++)lg[i]=lg[i>>1]+1;
    for(int i=1;i<=tot;i++)st[0][i]=seq[i];
    for(int k=1;k<=lg[tot];k++)
    for(int i=1;i+(1<<k)-1<=tot;i++)
    st[k][i]=Min(st[k-1][i],st[k-1][i+(1<<(k-1))]);
}
int qlca(int x,int y)
{
    if(x==y)return x;
    x=dfn[x];y=dfn[y];if(x>y)swap(x,y);x++;
    int k=lg[y-x+1];
    return fa[Min(st[k][x],st[k][y-(1<<k)+1])];
}
int pre[N],nxt[N],ins[N];
int stk[N],top=0;
int val[N];
int bel[N],sum[N],B;
void modify(int x,int y,int v)
{
    x=max(x,1);
    if(x>y)return;
    val[x]+=v;val[y+1]-=v;
    sum[bel[x]]+=v;sum[bel[y+1]]-=v;
}
void imply(int x,int v)
{
    int l=pre[x],r=nxt[x];
    int o=0;
    if(l)o=Max(o,qlca(l,x));
    if(r)o=Max(o,qlca(x,r));
    //cout<<len[o]<<' '<<len[x]-1<<' '<<l<<' '<<r<<endl;
    modify(len[o],len[x]-1,v);
}
void del(int x)
{
    //printf("del:%d\n",x);
    int l=pre[x],r=nxt[x];
    stk[++top]=x;
    nxt[l]=r;pre[r]=l;
    imply(x,-1);
}
int qry(int x)
{
    int res=0;
    for(int i=1;i<bel[x];i++)res+=sum[bel[i]];
    for(int i=(bel[x]-1)*B+1;i<=x;i++)res+=val[i];
    return res;
}
int P[N],K=0;
long long ans=0;
void gen2(int x,int u)
{
    if(x==K+1)
    {
        int w=qry(u);
        //cout<<u+1<<' '<<w<<endl;
        ans+=1ll*w*(u+1);
        return;
    }
    for(int p=P[x];;u*=p)
    {
        gen2(x+1,u);
        if(1ll*u*p>n)break;
    }
}
void gen(int x,int u)
{
    gen2(1,u);
    for(int j=x+1;j<=cnt&&1ll*u*prime[j]<=n;j++)
    {
        P[++K]=prime[j];
        int Top=top;
        for(int k=prime[j];k<=n;k+=prime[j])
        if((++vis[k])==1)del(pos[k]);
        gen(j,u*prime[j]);
        K--;
        for(int k=prime[j];k<=n;k+=prime[j])
        vis[k]--;
        while(top>Top)
        {
            int u=stk[top--];
            int l=pre[u],r=nxt[u];
            nxt[l]=u;pre[r]=u;
            imply(u,1);
        }
    }
}
int occ[N];
void dfs2(int x)
{
    occ[x]=ins[x];
    for(int y:G[x])
    {
        dfs2(y);
        occ[x]+=occ[y];
        if(occ[y])modify(len[x],len[y]-1,1);
    }
}
int main()
{
    //freopen("a.in","r",stdin);
    read(n);
    scanf("%s",s+1);
    for(int i=n;i>=1;i--)extend(i,s[i]-'a');
    for(int i=2;i<=tot;i++)G[fa[i]].push_back(i);
    build();
    for(int i=2;i<=n;i++)
    {
        if(!v[i])
        {
            v[i]=i;
            prime[++cnt]=i;
        }
        for(int j=1;j<=cnt;j++)
        {
            if(prime[j]>v[i]||1ll*i*prime[j]>n)break;
            v[i*prime[j]]=prime[j];
        }
    }
    B=sqrt(n);
    for(int i=1;i<=n;i++)bel[i]=(i-1)/B+1;
    for(int i=1;i<=n;i++)ins[pos[i]]=1;ins[1]=1;
    dfs2(1);
    int o=0;
    for(int i=1;i<=tot;i++)
    {
        if(!ins[seq[i]])continue;
        if(o)pre[seq[i]]=o;
        o=seq[i];
    }
    o=0;
    for(int i=tot;i>=1;i--)
    {
        if(!ins[seq[i]])continue;
        if(o)nxt[seq[i]]=o;
        o=seq[i];
    }
    gen(0,1);
    cout<<ans+1<<endl;
    return 0;
}


詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 22144kb

input:

4
abca

output:

14

result:

ok answer is '14'

Test #2:

score: 0
Accepted
time: 2ms
memory: 18044kb

input:

1
a

output:

1

result:

ok answer is '1'

Test #3:

score: 0
Accepted
time: 0ms
memory: 24228kb

input:

2
aa

output:

3

result:

ok answer is '3'

Test #4:

score: 0
Accepted
time: 0ms
memory: 22212kb

input:

2
ab

output:

3

result:

ok answer is '3'

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 26280kb

input:

100
xgljgljgljjljjjjljtjljtgljgljgljjljjjjljtjljtjljgljljgljgljjljjjjljtjljtjljgljllljgllgljgljjglljgljl

output:

1299455

result:

wrong answer expected '101808', found '1299455'