#include<bits/stdc++.h>
#define N 100005
#define P pair<int,int>
using namespace std;
typedef long long ll;
const int M=1e9+7;
const int inf=1e9+7;
char s[N];
int cur=1,cnt=1,last,ch[N*2][27],fa[N*2],dis[N*2],sg[N*2],mark[N*2][27];
void build(int c,int id){
last=cur;cur=++cnt;
int p=last;dis[cur]=id;
for(;p && !ch[p][c];p=fa[p])ch[p][c]=cur;
if(!p)fa[cur]=1;
else{
int q=ch[p][c];
if(dis[q]==dis[p]+1)fa[cur]=q;
else{
int nt=++cnt;dis[nt]=dis[p]+1;
memcpy(ch[nt],ch[q],sizeof(ch[q]));
fa[nt]=fa[q];fa[q]=fa[cur]=nt;
for(;ch[p][c]==q;p=fa[p])ch[p][c]=nt;
}
}
}
void dfs(int root)
{
//printf("%d\n",root);
for(int i=0;i<26;i++){
if(!ch[root][i])continue;
if(sg[ch[root][i]]==-1)dfs(ch[root][i]);
mark[root][sg[ch[root][i]]]=1;
}
for(int i=0;i<27;i++)
if(mark[root][i]==0)
{
sg[root]=i;
break;
}
}
int query()
{
int n=strlen(s);
int now=1;
for(int i=0;i<n;i++)
now=ch[now][s[i]-'a'];
return sg[now];
}
int main()
{
//freopen("C:\\Users\\acm-7\\Desktop\\1.txt","r",stdin);
memset(sg,-1,sizeof(sg));
while(~scanf("%s",s+1))
{
cnt=cur=1;
int n=strlen(s+1);
for(int i=1;i<=n;i++)build(s[i]-'a',i);
dfs(1);
int m,ans=0;
scanf("%d",&m);
while(m--){
scanf("%s",s);
ans^=query();
}
if(ans)printf("Alice\n");
else printf("Bob\n");
for(int i=0;i<=cnt;i++)
{
for(int j=0;j<27;j++)
mark[i][j]=ch[i][j]=0;
sg[i]=-1;
}
}
return 0;
}
后缀自动机模板(计蒜客24852题)
最新推荐文章于 2021-01-17 16:14:20 发布