背景:

暑假集训七月份最后一天,写写原来没有写过的blog\text{blog}blog吧。

题目传送门:

https://www.luogu.org/problemnew/show/P3966

题意:

给出nnn个单词构成的文章,求每一个单词分别在文章中出现了多次。

思路:

一种显然的思路就是AC\text{AC}AC自动机,记录每一个点分别属于那一些单词的end\text{end}end,每一次暴力在fail\text{fail}fail树上跳。
然而这样时间复杂度没法保证,只 有90pts\text{90pts}90pts。

我们当然要考虑正解。
事实上,我们发现这个问题的本质就是统计fail\text{fail}fail树的子树的大小(当然每一个加进来的点都要加上贡献)。
就可以Θ(n)\Theta(n)Θ(n)出解了。

暴力KMP\text{KMP}KMP也能跑过,因为字符集的大小有限。

代码

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
using namespace std;int n,len=0,st=0;char s[1000010];int end[210],ans[1000010],F[1000010];
queue<int> f;
struct node
{int fail;int son[30];node(){fail=0;memset(son,0,sizeof(son));}
} tr[1000010];
void build(char *s,int id)
{int l=strlen(s),x=0;for(int i=0;i<l;i++){if(!tr[x].son[s[i]-'a']) tr[x].son[s[i]-'a']=++len;x=tr[x].son[s[i]-'a'];ans[x]++;}end[id]=x;
}
void get_fail()
{while(!f.empty()) f.pop();for(int i=0;i<26;i++)if(tr[0].son[i]){tr[tr[0].son[i]].fail=0;f.push(tr[0].son[i]);}while(!f.empty()){int x=f.front();F[++st]=x;f.pop();for(int i=0;i<26;i++){int y=tr[x].son[i];if(y){tr[y].fail=tr[tr[x].fail].son[i];f.push(y);}else tr[x].son[i]=tr[tr[x].fail].son[i];}}
}
void solve()
{for(int i=len;i>=0;i--)ans[tr[F[i]].fail]+=ans[F[i]];
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s);build(s,i);}tr[0].fail=0;get_fail();solve();for(int i=1;i<=n;i++)printf("%d\n",ans[end[i]]);
}

luogu P3966 [TJOI2013]单词相关推荐

  1. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  2. P3966 [TJOI2013]单词

    \(\color{#0066ff}{ 题目描述 }\) 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. ...

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

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

  4. fail树(bzoj 3172: [Tjoi2013]单词)

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

  5. 解题报告:luogu P1688 新单词接龙问题【trie树、dfs、DP递推】

    单词的变化有三种:1删掉一个字母,2:插入一个字符,3:将一个字符变成另外一个字符 dig→fig→fin→fine→winedig→fig→fin→fine→winedig→fig→fin→fine ...

  6. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...

  7. BZOJ3172: [Tjoi2013]单词

    [传送门:BZOJ3172] 简要题意: 给出n个单词,你可以理解为将这些单词变成一个个段落,然后求出每个单词在所有段落中出现的次数 题解(一): 刚开始不是很懂题目,结果发现将所有单词看成一篇文章, ...

  8. BZOJ3172 TJOI2013 单词

    传送门 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词, ...

  9. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你NNN个单词,请你求出每一个单词在这NNN个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. LinkLinkLink [洛谷3796][模板]AC自动 ...

  10. [TJOI2013] 单词

    题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入描述: 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词 ...

最新文章

  1. Swift标识符和keyword
  2. R语言实战(七)图形进阶
  3. 一个给自己挖坑的网络综合实验(后悔莫及)
  4. Spring 解耦反射创建对象
  5. 矩池云上安装yolov5并测试
  6. JDK8新特性-Lambda表达式查找
  7. 光流.flo文件生成.png图片(可批量)
  8. 做{...}而(0) - 有什么好处? [重复]
  9. fastText:极快的文本分类工具
  10. 【例9.3】求最长不下降序列
  11. json和ajax使用
  12. java成员变量注释规范_java编程规范之java注释规范
  13. java实现分页序号问题_java 分页查询的实现
  14. Java 经纬度转UTM投影
  15. html tooltips效果,div+css样式自制带小三角的tooltips效果
  16. Python崛金系列--4.python量化股票
  17. win10 1073linux密码,Linux Bash on Win10 忘记密码解决
  18. #VICE对话摄影师# 旅居车是一种生活态度
  19. 外贸行业找客户的三种方式和五种工具
  20. 粤港澳大湾区新地标,128米高“湾区之光”摩天轮重构深圳天际线

热门文章

  1. Linux下隐藏文件和显示隐藏文件命令
  2. 完全卸载SQL server 2005的方法
  3. 我的世界服务器修改空岛范围,我的世界空岛指令权限大全 | 手游网游页游攻略大全...
  4. Cloud Rush—聚是一团火
  5. 用php 用拼出一个菱形_用php语言编程:输出一个由“*”符号组成的菱形图形(必须使用for循环语句)...
  6. 最新WIN10系统封装教程2019系列(七)——封装
  7. UX美即好用效应 Aesthetic Usability Effect
  8. 百度云离线下载含有违规内容检测方法分析
  9. 优秀课程案例:使用Scratch制作飞机大战游戏!
  10. DDD中常提到的应用架构总结(六边形、洋葱、整洁、清晰)