传送门

统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说……

统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了

然后考虑怎么让所有串之间隔开。本来打算建个广义SAM后来发现没办法处理子串重复的情况……然后就按题解里的方法在每两个串之间加入一个新字符然后直接对整个串建好了

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 const int N=4e6+5;
 7 int fa[N],ch[N][27],l[N],cnt[N],last=1,tot=1;
 8 char s[N>>1],t[N>>1];int len[N>>1],c[N],a[N],k,ans[N],n;
 9 void ins(int c){
10     int p=last,np=++tot;last=np,l[np]=l[p]+1,cnt[np]=1;
11     for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
12     if(!p) fa[np]=1;
13     else{
14         int q=ch[p][c];
15         if(l[q]==l[p]+1) fa[np]=q;
16         else{
17             int nq=++tot;l[nq]=l[p]+1;
18             memcpy(ch[nq],ch[q],sizeof(ch[q]));
19             fa[nq]=fa[q],fa[q]=fa[np]=nq;
20             for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
21         }
22     }
23 }
24 inline void calc(){
25     for(int i=1;i<=tot;++i) ++c[l[i]];
26     for(int i=1;i<=tot;++i) c[i]+=c[i-1];
27     for(int i=1;i<=tot;++i) a[c[l[i]]--]=i;
28     for(int i=tot;i;--i) cnt[fa[a[i]]]+=cnt[a[i]];
29 }
30 int main(){
31 //    freopen("testdata.in","r",stdin);
32     scanf("%d",&n);
33     for(int i=1;i<=n;++i){
34         scanf("%s",t+1);len[i]=strlen(t+1);
35         for(int j=1;j<=len[i];++j) ins(s[++k]=t[j]-'a');
36         ins(s[++k]=26);
37     }
38     calc();k=0;
39     for(int i=1,x,j;i<=n;++i){
40         for(j=1,x=1;j<=len[i];++j)
41         x=ch[x][s[++k]];
42         ans[i]=cnt[x];
43         ++k;
44     }
45     for(int i=1;i<=n;++i) printf("%d\n",ans[i]);
46     return 0;
47 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9640355.html

洛谷P3966 [TJOI2013]单词(后缀自动机)相关推荐

  1. 洛谷 - P3975 [TJOI2015]弦论(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s,再给出一次询问,询问分为两种类型: 0 k:如果不同位置的相同子串算作一个,求第 k 小的子串 1 k:如果不同位置的相同子串算作多个,求第 k 小的 ...

  2. 洛谷 P4218 [CTSC2010]珠宝商 后缀自动机+点分治

    题目: https://www.luogu.org/problemnew/show/P4218 分析: 一种显然的暴力就是枚举一个起点,在这个点进行dfs,然后在后缀自动机上跟着跳.跳到的点的righ ...

  3. 洛谷_3975 [TJOI2015]弦论(后缀自动机)

    [TJOI2015]弦论 题目链接:https://www.luogu.com.cn/problem/P3975 题解: 对于T==0,只需要构造自动机,将每个状态节点的cnt设为1,然后DFS即可. ...

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

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

  5. 2019.03.04【ZJOI2018】【BZOJ5213】【洛谷P4339】迷宫(自动机)(数论)

    BZOJ传送门 洛谷传送门 解析: 这道题本质其实是要最小化一个能够接受所有mmm进制下KKK的倍数的自动机. 显然我们有一个方案就是KKK个节点,iii的第jjj条边向(i∗m+j)%K(i*m+j ...

  6. 洛谷P2412 查单词 [trie树 RMQ]

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

  7. 【洛谷P1381】单词背诵

    题目描述 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一个).并且在背诵的单词量尽量多的情 ...

  8. 洛谷 - P1308 统计单词数(字符串+模拟)

    题目链接:点击查看 题目大意:给出一个字符串a和字符串b,现在问字符串b中有多少个单词与字符串a相等,并记录第一次出现的位置 题目分析:看似很简单的一个模拟题,其实包含了不少需要注意的地方: stri ...

  9. P3966 [TJOI2013]单词

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

最新文章

  1. JAVA 双重检查锁定和延迟初始化
  2. UpdatePanel中用后台调用Javascript
  3. OpenCV cv :: UMat与DirectX9曲面的互操作性的实例(附完整代码)
  4. 创建基于MailKit和MimeKit的.NET基础邮件服务
  5. nginx配置多个conf文件
  6. python 菜鸟教程
  7. 次时代各制作插件使用方案以及技巧,包括UV,烘焙,减面等
  8. css after伪元素做文字下划线
  9. 38、稀疏矩阵的十字链表表示和创建
  10. win7访问smb文件服务器,win7系统配置smb服务器
  11. 个人简介之物理层安全
  12. 【FPGA的基础快速入门31-----环境光传感器】
  13. Python之禅及其翻译
  14. 重写equals方法一定要重写hashcode方法吗
  15. 解决Duplicate entry '……
  16. python量化交易笔记---13.描述性统计
  17. 手机新手上路_术语_各种解释
  18. iOS In-App Purchase 内购之创建内购产品
  19. MUX实现逻辑功能(反相器/与门/或门/与非门/或非门/异或门/同或门)
  20. SQL Server2019还原.bak文件为数据库且更改数据库的存放位置

热门文章

  1. codevs1032
  2. mariadb自动安装脚本
  3. 2015: [Usaco2010 Feb]Chocolate Giving
  4. JAVA SAX解析XML字符串实例
  5. thinkphp链接mssql以及查询中文乱码问题
  6. 网络时间协议 --- 网络对时程序
  7. 《Arduino实战》——第1章 你好Arduino
  8. 《当用户体验设计遇上敏捷》一3.5 小结
  9. lable、ul、ol、dl和table、fieldset标签
  10. Linux 下Shell脚本删除过期文件