#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
#define N 1000010
int n,m,S_tot;
char S[N*2];
int Ws[N];
struct SAM{
SAM *fa,*son[26];
int val,size;
void S_clear(){
fa=0;val=0;
memset(son,0,sizeof(son));
}
}*root,*last,State[N*2],*tot,*pos[N*2],*q[N*2];
int Num[N*2];
void Init()
{
tot=State;last=root=tot++;
root->S_clear();
}
void Insert(int w)
{
SAM *p=last,*np=tot++;np->S_clear();
np->val=p->val+1;np->size=1;
while(p&&!p->son[w])
p->son[w]=np,p=p->fa;
if(!p)
np->fa=root;
else
{
SAM *q=p->son[w];
if(q->val==p->val+1)
np->fa=q;
else
{
SAM *nq=tot++;nq->S_clear();
nq->val=p->val+1;
memcpy(nq->son,q->son,sizeof(q->son));
nq->fa=q->fa;q->fa=np->fa=nq;
while(p&&p->son[w]==q)
p->son[w]=nq,p=p->fa;
}
}
last=np;
}
int main()
{
scanf("%s",S);
n=(int)strlen(S);
Init();
for(int i=0;i<n;i++)
Insert(S[i]-'a');
int qwer=(int)(tot-State);
for(SAM *p=State;p!=tot;p++)
Ws[p->val]++;
for(int i=1;i<=n;i++)
Ws[i]+=Ws[i-1];
for(SAM *p=State;p!=tot;p++)
pos[--Ws[p->val]]=p;
for(int i=qwer-1;i>=0;i--)
{
SAM *p=pos[i];
if(p->fa)
p->fa->size+=p->size;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
long long Ans=0;
scanf("%s",S+1);S_tot=0;
int len=(int)strlen(S+1);
for(int j=1;j<=len;j++)
S[j+len]=S[j];
SAM *p=root;
int L=0;
for(int j=1;j<=len*2;j++)
{
int num=S[j]-'a';
if(p->son[num])
{
L++;
p=p->son[num];
}
else
{
while(p&&!p->son[num])
p=p->fa;
if(!p)
p=root,L=0;
else L=p->val+1,p=p->son[num];
}
while(p->fa&&p->fa->val>=len)
p=p->fa,L=p->val;
if(L>=len)
{
if(p->size==0)
continue;
Ans+=p->size;
q[++S_tot]=p;Num[S_tot]=p->size;
p->size=0;
}
}
for(int i=1;i<=S_tot;i++)
{
SAM *now=q[i];
now->size=Num[i];
}
printf("%I64d\n",Ans);
}
return 0;
}
codeforces 235C Cyclical Quest
最新推荐文章于 2024-08-24 14:01:36 发布