洛谷P3966 [TJOI2013]单词 题解

题目链接:P3966 [TJOI2013]单词

题意

小张最近在忙毕设,所以一直在读论文。一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次。

1≤n≤2001 \leq n \leq 2001≤n≤200,单词总长度不超过 10610^6106。

瞎搞做法能跑到最优解前3页也是有趣

这个文章看样例应该是单词间有空格的

于是我们就把所有单词全部加上去,用 #\tt{\#}# 分隔

然后就变成 P5357 AC自动机二次加强版 了

具体的就是把暴力跳fail数组改成topo排序更新

时间复杂度 O(26×∑si)O(26 \times \sum s_i)O(26×∑si​)

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <random>
#include <queue>
using namespace std;
// #define int long long
// #define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(205)
#define L (int)(1e6+215)int n,f[N],fail[L],val[L],in[L],ans[N];
string s,t;
struct Trie
{queue<int> q;int tot,trie[L][26],ed[L];void insert(string s,int id){int u=0;for(int i=0; i<s.size(); i++){int c=s[i]-'a';if(!trie[u][c])trie[u][c]=++tot;u=trie[u][c];}if(!ed[u])ed[u]=id;f[id]=ed[u];}void build(){for(int i=0; i<26; i++)if(trie[0][i])q.push(trie[0][i]);while(!q.empty()){int u=q.front();q.pop();for(int i=0; i<26; i++){if(trie[u][i]){fail[trie[u][i]]=trie[fail[u]][i];++in[trie[fail[u]][i]];q.push(trie[u][i]);}else trie[u][i]=trie[fail[u]][i];}}}void AC(){int u=0;for(int i=0; i<t.size(); i++){if(t[i]=='#')u=0;else u=trie[u][t[i]-'a'];++val[u];}for(int i=1; i<=tot; i++)if(!in[i])q.push(i);while(!q.empty()){u=q.front(); q.pop();if(ed[u])ans[ed[u]]=val[u];val[fail[u]]+=val[u];if(!--in[fail[u]])q.push(fail[u]);}}
}tr;
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// freopen("check.in","r",stdin);// freopen("check.out","w",stdout);cin >> n;for(int i=1; i<=n; i++){cin >> s; t+=s+"#";tr.insert(s,i);}tr.build(); tr.AC();for(int i=1; i<=n; i++)cout << ans[f[i]] << '\n';return 0;
}

转载请说明出处

洛谷P3966 [TJOI2013]单词 题解相关推荐

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

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

  2. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  3. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  4. 洛谷P1273 有线电视网 题解

    洛谷P1273 有线电视网 题解 题目链接:P1273 有线电视网 题意: 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为 ...

  5. 洛谷P4568 [JLOI2011] 飞行路线 题解

    洛谷P4568 [JLOI2011] 飞行路线 题解 题目链接:P4568 [JLOI2011] 飞行路线 题意: Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公 ...

  6. 洛谷P3426 [POI2005]SZA-Template 题解

    洛谷P3426 [POI2005]SZA-Template 题解 题目链接:P3426 [POI2005]SZA-Template 题意:你打算在纸上印一串字母. 为了完成这项工作,你决定刻一个印章. ...

  7. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

  8. 洛谷P1262 间谍网络题解

    洛谷P1262 间谍网络题解 题目大意 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果 A 间谍手中掌握着关于 B 间谍的犯罪证据,则称 A 可以揭发 B.有些间谍收受贿赂,只要 ...

  9. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  10. 洛谷P4099 [HEOI2013]SAO 题解

    洛谷P4099 [HEOI2013]SAO 题解 题目链接:P4099 [HEOI2013]SAO 题意: Welcome to SAO ( Strange and Abnormal Online). ...

最新文章

  1. 《C++语义和性能分析》读书笔记
  2. 7.分布式数据库HBase第3部分
  3. WampServer的研究日记二
  4. php和js操作数据库的区别,PHP基础与JS操作的区别
  5. Android面试总结经
  6. ladp3 获取属性_Ldap3库使用方法(四)
  7. 【转】程序员技术练级攻略
  8. Tensorflow:tfrecord数据读取和保存
  9. 张宇真题全解(纯题目)
  10. 解决firefox一个邮箱两个账户导致收藏夹不同步的问题
  11. ug冲模标准件库_UG NX插件
  12. vscode自动排版_微信公众号排版 | 最适合程序员的公众号排版
  13. c语言中人脸磨皮算法,人脸磨皮算法
  14. java获取登录内网ip地址
  15. 中国古典学名著选读网课考试题2021版答案
  16. 基于springboot的ShardingSphere5.2.1的分库分表的解决方案之数据加密之RSA的解决方案(九)
  17. mysql 取一条离当前时间最近的记录
  18. 程序员:是花光积蓄在深圳买房?还是回到长沙过“富余”生活?
  19. 批量下载sra文件linux,Linux下从NCBI批量下载SRA数据的sra和aspera方法
  20. apktool下载及“安装”(windows系统)

热门文章

  1. 如何实现网页中按钮的自动点击?
  2. Ubuntu18.04 打不开系统蓝牙适配器,也连接不上任何蓝牙设备Bug解决方案
  3. asp.net 将bmp格式图片怎么转换为jpg_如何把jpeg转换成jpg?分享两种jpeg转换jpg的方法...
  4. 使用html语言替换字符串中的特殊标点符号
  5. ****怎么解决UBUNTU里面VIM编辑器键盘错乱问题****
  6. AVAudioPlayer实现音乐播放+歌词与播放进度同步
  7. 字符集和字符集编码详解
  8. 英文歌曲推荐(lady gaga\Taylor swift\Adele等)
  9. selenium上传附件的两种方式(普通上传和借助AutoIt识别Windows上传窗口)
  10. ASP.NET 安全认证(二)【转】