博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3065 AC自动机
阅读量:6268 次
发布时间:2019-06-22

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

hdu3065

题意:给出n个病毒串(模式串),再给出一个待匹配串,问每种模式串在其中出现了几次,0次不输出

也是将AC自动机的模板稍微修改了一下,由于每个模式串都不同,所以直接用cnt数组记录结点代表的模式串的标号,在匹配串时计数就可以了

1 #include
2 #include
3 #include
4 using namespace std; 5 const int maxm=1010*55; 6 7 char s[2000000+50],word[1010][55]; 8 int c; 9 int vis[1010];10 int nxt[maxm][128-30],cnt[maxm],fail[maxm],size;11 12 int newnode(){13 memset(nxt[size],0,sizeof(nxt[size]));14 fail[size]=cnt[size]=0;15 return size++;16 }17 18 void insert(char s[],int k){19 int i,p=0;20 for(i=0;s[i];i++){21 int &x=nxt[p][s[i]-30];22 p=x?x:x=newnode();23 }24 cnt[p]=k;25 }26 27 void makenxt(){28 int i;29 queue
q;30 q.push(0);31 while(!q.empty()){32 int u=q.front();33 q.pop();34 for(i=0;i<128-30;i++){35 int v=nxt[u][i];36 if(v==0)nxt[u][i]=nxt[fail[u]][i];37 else q.push(v);38 if(u&&v){39 fail[v]=nxt[fail[u]][i];40 }41 }42 }43 }44 45 void query(char s[]){46 int d=0;47 for(int i=0;s[i];i++){48 d=nxt[d][s[i]-30];49 int tmp=d;50 while(tmp!=0){51 vis[cnt[tmp]]++;52 tmp=fail[tmp];53 }54 }55 }56 57 int main(){58 int n;59 while(scanf("%d",&n)!=EOF){60 size=0,newnode();61 int i;62 memset(cnt,0,sizeof(cnt));63 memset(vis,0,sizeof(vis));64 for(i=1;i<=n;i++){65 scanf("%s",word[i]);66 insert(word[i],i);67 }68 makenxt();69 scanf("%s",s);70 query(s);71 for(i=1;i<=n;i++){72 if(vis[i])printf("%s: %d\n",word[i],vis[i]);73 }74 }75 return 0;76 }
hdu3065

 

转载于:https://www.cnblogs.com/cenariusxz/p/4510988.html

你可能感兴趣的文章
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
MaxCompute 学习计划(一)
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>