博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5853 Jong Hyok and String(广义后缀自动机)
阅读量:4553 次
发布时间:2019-06-08

本文共 1977 字,大约阅读时间需要 6 分钟。

题目链接:

题意:

给你n个字符串,m个询问,每次询问一个字符串

定义set(s)={(i,j)} 表示 s在第i个字符串中出现,且末尾位置为j。

对于一个询问,求set(Qi)=set(t) ,t串的数量。

题解:

如果是n=1,那么就是后缀自动机的一道裸题,答案就是Qi串匹配的最后一个节点x,ml[x]-ml[f[x]]。

现在是多个串,那么就建立一个广义后缀自动机。每次插入一个串后,将last=root,然后继续插下一个就行了。

最后匹配还是一样的操作。

1 #include
2 #include
3 #define F(i,a,b) for(int i=a;i<=b;++i) 4 #define mst(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 7 const int N=1e5+7,tyn=26,M=N*2; 8 struct SAM{ 9 int tr[M][tyn],f[M],ml[M],ed,last,p,x,r,q;10 int cnt[M],b[M],d[M];11 inline int gid(char x){
return x-'a';}12 inline void nc(int s,int &p){13 ml[p=++ed]=s,f[ed]=cnt[ed]=0,mst(tr[ed],0);14 }15 void clear(){ed=0,nc(0,last);}16 void add(int w){17 nc(ml[x=last]+1,p),last=p,cnt[p]=1;18 while(x&&!tr[x][w])tr[x][w]=p,x=f[x];19 if(!x)f[p]=1;20 else if(ml[x]+1==ml[q=tr[x][w]])f[p]=q;21 else{22 nc(ml[x]+1,r),f[r]=f[q],f[p]=f[q]=r;23 memcpy(tr[r],tr[q],sizeof(tr[r]));24 while(x&&tr[x][w]==q)tr[x][w]=r,x=f[x];25 }26 }27 void build(char *s){
for(int i=1;s[i];i++)add(gid(s[i]));}28 29 int go(char *s,int x=1)//与s做匹配30 {31 int len=strlen(s+1);32 for(int i=1;i<=len;i++)33 {34 int w=gid(s[i]);35 if(tr[x][w])x=tr[x][w];36 else return 0;37 }38 return ml[x]-ml[f[x]];39 }40 }sam;41 42 char s[N];43 int t,n,m,cas;44 45 int main()46 {47 scanf("%d",&t);48 while(t--)49 {50 scanf("%d%d",&n,&m);51 sam.clear();52 F(i,1,n)53 {54 sam.last=1;55 scanf("%s",s+1);56 sam.build(s);57 }58 printf("Case #%d:\n",++cas);59 F(i,1,m)60 {61 scanf("%s",s+1);62 printf("%d\n",sam.go(s));63 }64 }65 return 0;66 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/7612979.html

你可能感兴趣的文章
errno.h含义
查看>>
字典树(模型体)
查看>>
盒模型详解
查看>>
bzoj2157 旅游
查看>>
bzoj5016 [Snoi2017]一个简单的询问
查看>>
poj2417 bzoj3239 Discrete Logging(bsgs)
查看>>
UVa10054 - The Necklace(欧拉回路【输出带来的麻烦)
查看>>
string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections...
查看>>
6月27日 ajax
查看>>
iOS开发之画图板(贝塞尔曲线)
查看>>
4嵌入式作业io
查看>>
IntelliJ Idea编译报错:javacTask: 源发行版 1.7 需要目标发行版 1.7
查看>>
Cognos中新建SQLserver数据源的步骤
查看>>
HttpClient连接超时及读取超时
查看>>
SQL优化方法
查看>>
SEO必须掌握的高级搜索指令
查看>>
生产者消费者模型
查看>>
ORACLE 字符串超长问题解决方案
查看>>
使用ZooKeeper协调多台Web Server的定时任务处理(方案1)
查看>>
20171116 每周例行报告
查看>>