博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj3172】 Tjoi2013—单词
阅读量:4573 次
发布时间:2019-06-08

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

 (题目链接)

题意

  $n$个单词组成文本,问每个单词在文本中出现了几次。

Solution

  题目数据范围写错了,mdzz。

  构AC自动机统计每个点被经过的次数,然后按照fail树自底向上更新。

细节

  ?

代码

// bzoj3172#include
#include
#include
#include
#include
#include
#define LL long long#define inf (1ll<<30)#define Pi acos(-1.0)#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)using namespace std;const int maxn=1000010;int n,sz=1,pos[maxn],q[maxn];char s[maxn];struct node { int son[26],next,sum; int& operator [] (int x) {return son[x];}}tr[maxn];namespace ACM { void insert(char *r,int t) { int p=1,len=strlen(r+1); for (int i=1;i<=len;i++) { if (!tr[p][r[i]-'a']) tr[p][r[i]-'a']=++sz; p=tr[p][r[i]-'a']; tr[p].sum++; } pos[t]=p; } void buildfail() { int l=1,r=1;q[1]=1; tr[1].next=0; while (l<=r) { int x=q[l++]; for (int i=0;i<26;i++) if (tr[x][i]) { int k=tr[x].next; while (!tr[k][i]) k=tr[k].next; tr[tr[x][i]].next=tr[k][i]; q[++r]=tr[x][i]; } } for (int i=r;i>=1;i--) tr[tr[q[i]].next].sum+=tr[q[i]].sum; }}using namespace ACM;int main() { scanf("%d",&n); for (int i=0;i<26;i++) tr[0][i]=1; for (int i=1;i<=n;i++) { scanf("%s",s+1); insert(s,i); } buildfail(); for (int i=1;i<=n;i++) printf("%d\n",tr[pos[i]].sum); return 0;}

 

转载于:https://www.cnblogs.com/MashiroSky/p/6498720.html

你可能感兴趣的文章
(tips,javascript,office)客户端操作excel文档的注意事项
查看>>
pku 1094 Sorting It All Out ——拓扑排序
查看>>
笔记javascript
查看>>
uva 10608 Friends 并查集
查看>>
Java.util.Map排序输出
查看>>
iOS 字体下载
查看>>
Distinct
查看>>
INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net解决办法
查看>>
SQL 循环语句
查看>>
XML文档
查看>>
Java 泛型
查看>>
定义页面加载和导航时要执行的函数/自定义事件
查看>>
rem.js
查看>>
Unslider.js Tiny Sample
查看>>
FPGA的学习及注意事项
查看>>
关于python中,map,reduce,filter,sort函数的用法:
查看>>
面向对象内存分析
查看>>
Dijkstra BZOJ2763 [JLOI2011]飞行路线
查看>>
前端快捷键
查看>>
重新认识成功、失败、错误、平凡、笨拙
查看>>