WOJ#3831 TJOI2013单词

题面

  某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

输入

  第一个一个整数 N ,表示有多少个单词,接下来 N 行每行一个单词。

输出

  输出 N 个整数,第 i 行的数字表示第 i 个单词在文章中出现了多少次。

样例输入

  3
  a
  aa
  aaa

样例输出

  6
  3
  1

提示

  对于全部数据,1≤N≤200 ,所有单词长度的和不超过 106,保证每个单词由小写字母组成。

题解

  本题中,第2行到第N+1行构成论文,同时每一行也是单词,所以我们可以用AC自动机求解,依次用每一个单词进行匹配,每次匹配到一个单词的结尾时,就在ans数组中对应这个结尾的单词序号的位置记录答案。

  但是想一想就会发现上述方法不但会超时,还可能在单词出现重复时出错(Trie树上记录单词结尾时只能记录一个单词的序号,遇到重复时重复单词会因此得到0,笔者最初就是因为没考虑这一点而错误)。因此我们可以用一个sme数组来记录每一种单词的序号,同时在Trie树上记录单词结尾时记录这种单词的序号。再进一步思考可以发现,如果我们把每个单词的重复次数用tim数组记录下来,就可以避免因重复查询带来的超时。

代码

#include<bits/stdc++.h>
using namespace std;
#define N 1000010
int n,tot,ans[N],nxt[N],sme[N],tim[N],vis[N],ch[N][];
char CH[][];
void build(char *s,int ord){
int u=,len=strlen(s);
for(int i=;i< len;i++){
int c=s[i]-'a';
if(!ch[u][c]){ch[u][c]=++tot;memset(ch[tot],,sizeof(ch[tot]));}
u=ch[u][c];
}
if(!vis[u]){vis[u]=ord;sme[ord]=ord;tim[ord]=;}
else{sme[ord]=vis[u];tim[vis[u]]++;}
return ;
}
void bfs(){
queue<int>q;
for(int i=;i<=;i++) ch[][i]=;
q.push();nxt[]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=;i<=;i++){
if(!ch[u][i]){ch[u][i]=ch[nxt[u]][i];continue;}
q.push(ch[u][i]);
int v=nxt[u];nxt[ch[u][i]]=ch[v][i];
}
}
}
void find(char *s,int num){
int u=,len=strlen(s);
for(int i=;i<=len;i++){
int c=s[i]-'a',k=ch[u][c];
while(k>){
if(vis[k]) ans[vis[k]]+=num;
k=nxt[k];
}
u=ch[u][c];
}
return ;
}
int main(){
scanf("%d",&n);tot=;
for(int i=;i<=n;i++){scanf("%s",CH[i]);build(CH[i],i);}
bfs();
for(int i=;i<=n;i++){if(sme[i]==i) find(CH[i],tim[i]);}
for(int i=;i<=n;i++){printf("%d\n",ans[sme[i]]);}
return ;
}
 

#3831 TJOI2013单词的更多相关文章

  1. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  2. 【BZOJ3172】[Tjoi2013]单词 AC自动机

    [BZOJ3172][Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

  3. 3172: [Tjoi2013]单词

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3246  Solved: 1565[Submit][Status ...

  4. BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 268   Solved: 145 [ Submit][ St ...

  5. [TJOI2013]单词

    2755: [TJOI2013]单词 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 3[Submit][Status][Web B ...

  6. P3966 [TJOI2013]单词

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

  7. 【洛谷】3966:[TJOI2013]单词【AC自动机】【fail树】

    P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...

  8. bzoj 3172: [Tjoi2013]单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  9. BZOJ3172 [Tjoi2013]单词 【AC自动机】

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...

随机推荐

  1. HBase HA分布式集群搭建

    HBase HA分布式集群搭建部署———集群架构 搭建之前建议先学习好HBase基本构架原理:https://www.cnblogs.com/lyywj170403/p/9203012.html 集群 ...

  2. CS与BS的比较

    对象 硬件环境 客户端要 求           软件安装 升级和维护 安全性 C/S 用户固定,并且处于相同区域, 要求拥有相同的操作系统. 客户端的计算机电脑配置要求较高. 每一个客户端都必须安装 ...

  3. bzoj2306 [Ctsc2011]幸福路径 倍增 Floyd

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2306 题解 倍增 Floyd. 令 \(f[i][j][k]\) 表示走了 \(2^i\) 步 ...

  4. 为按钮绑定实现js跳转

    页面代码 <button type="button" class="btn btn-xs btn-info" id="add" nam ...

  5. Python---基础----数据类型的内置函数(主要介绍字符串、列表、元组、字典、集合的内置函数)(二)

    2019-05-24 -------------------------------- 一. # splitlines()    以换行切割字符串s = '''日照香炉生紫烟\n疑是银河落九天\n飞流 ...

  6. Github熟悉一

    Code/代码 Commits/提交 Issues/问题 Packages/包装 Marketplace/市场 Topics/话题 Wikis/维基百科 Users/用户 Pull requests/ ...

  7. 15:解决IntelliJ IDEA的乱码问题

    1. -Dfile-encodings=UTF-8 ,全局:

  8. php current()函数 语法

    php current()函数 语法 作用:返回数组中的当前元素的值.直线电机工作原理 语法:current(array) 参数: 参数 描述 array 必需.规定要使用的数组. 说明:返回数组中的 ...

  9. android开发里跳过的坑——GridView使用Glide加载图片不显示

    用grideview显示本地图片列表,用了Glide加载框架,具体调用如下: Glide.with(mContext).load(Uri.fromFile(file)).into(imageView) ...

  10. PHPExcel 之常用功能

    PHPExcel基本操作: 定义EXCEL实体 即定义一个PHPEXCEL对象,并设置EXCEL对象内显示内容 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...