您的位置:首页 > 其它

2017-10-湖南套题4

2017-10-19 15:28 253 查看

#include <cstring>
#include <cstdio>

#define swap(a,b) {int c=a;a=b;b=c;}

const int N(1000000);
char s
;
int n,m;

int len
,tr
[27],tot;
int dep
,dad
[23];
inline void Ins(int u)
{
int v=tot;
dad[v][0]=u; dep[v]=dep[u]+1;
for(int i=1; i<=20; ++i)
dad[v][i]=dad[dad[v][i-1]][i-1];
}
inline void Build(int k)
{
int l=strlen(s+1),now=0;
for(int x,i=l; i; --i)
{
x=s[i]-'a';
if(!tr[now][x]) tr[now][x]=++tot,
Ins(now);   now=tr[now][x];
}
len[k]=now;
}

inline int LCA(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
for(int i=20; i>=0; --i)
if(dep[dad[y][i]]>=dep[x]) y=dad[y][i];
if(x==y) return x;
for(int i=20; i>=0; --i)
if(dad[x][i]!=dad[y][i]) x=dad[x][i],y=dad[y][i];
return dad[x][0];
}
/*
5 5
zzj
pri
prime
ime
owaski
2 3 1 3 5
2 2 2 3
1 actri
2 2 3 4
2 3 2 6 5
*/
int Presist()
{
freopen("biology.in","r",stdin);
freopen("biology.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; ++i)
scanf("%s",s+1),Build(i);
for(int op,t,u,v; m--; )
{
scanf("%d",&op);
if(op==1)
scanf("%s",s+1),Build(++n);
else
{
scanf("%d%d",&t,&u);
int lca=len[u];
for(int i=2; i<=t; ++i)
{
scanf("%d",&v);
lca=LCA(lca,len[v]);
}
printf("%d\n",dep[lca]);
}
}
//    for(int i=1; i<=tot; ++i) printf("%d ",dep[i]);
return 0;
}

int Aptal=Presist();
int main(int argc,char**argv){;}
AC  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: