QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#560006 | #9244. Counting Strings | Larunatrecy | WA | 2ms | 26280kb | C++14 | 4.4kb | 2024-09-12 11:23:13 | 2024-09-12 11:23:13 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'