题意:给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串?

本质相同的子串算多个。

对于 100% 的数据,1<=n,k<=10^5,所有字符串总长不超过10^5,字符串只包含小写字母。

思路:From 15年国家集训队张天扬论文

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned int uint;
  5. typedef unsigned long long ull;
  6. typedef pair<int,int> PII;
  7. typedef pair<ll,ll> Pll;
  8. typedef vector<int> VI;
  9. typedef vector<PII> VII;
  10. typedef pair<ll,int>P;
  11. #define N 100010
  12. #define M 210000
  13. #define fi first
  14. #define se second
  15. #define MP make_pair
  16. #define pi acos(-1)
  17. #define mem(a,b) memset(a,b,sizeof(a))
  18. #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
  19. #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
  20. #define lowbit(x) x&(-x)
  21. #define Rand (rand()*(1<<16)+rand())
  22. #define id(x) ((x)<=B?(x):m-n/(x)+1)
  23. #define ls p<<1
  24. #define rs p<<1|1
  25.  
  26. const int MOD=1e9+,inv2=(MOD+)/;
  27. double eps=1e-;
  28. int INF=<<;
  29. ll inf=5e13;
  30. int dx[]={-,,,};
  31. int dy[]={,,-,};
  32.  
  33. string s[N];
  34. int p,np,q,nq,k,cas;
  35.  
  36. int read()
  37. {
  38. int v=,f=;
  39. char c=getchar();
  40. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  41. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  42. return v*f;
  43. }
  44.  
  45. struct sam
  46. {
  47. int cnt;
  48. int fa[N<<],t[N<<][];
  49. int st[N<<],b[N<<],bl[N<<],c[N<<];
  50. ll f[N<<];
  51.  
  52. sam()
  53. {
  54. cnt=;
  55. }
  56.  
  57. void add(int x)
  58. {
  59. p=np; st[np=++cnt]=st[p]+;
  60. while(p&&!t[p][x])
  61. {
  62. t[p][x]=np;
  63. p=fa[p];
  64. }
  65. if(!p) fa[np]=;
  66. else if(st[p]+==st[q=t[p][x]]) fa[np]=q;
  67. else
  68. {
  69. st[nq=++cnt]=st[p]+;
  70. memcpy(t[nq],t[q],sizeof t[q]);
  71. //t[nq]=t[q];
  72. fa[nq]=fa[q];
  73. fa[q]=fa[np]=nq;
  74. while(p&&t[p][x]==q)
  75. {
  76. t[p][x]=nq;
  77. p=fa[p];
  78. }
  79. }
  80. }
  81.  
  82. void solve()
  83. {
  84. rep(i,,cas)
  85. {
  86. int u=;
  87. rep(j,,(int)s[i].size()-)
  88. {
  89. int p=u=t[u][s[i][j]-'a'];
  90. while(p!=&&b[p]!=i)
  91. {
  92. c[p]++; b[p]=i;
  93. p=fa[p];
  94. }
  95. }
  96. }
  97. rep(i,,cnt) b[i]=;
  98. rep(i,,cnt) b[st[i]]++;
  99. rep(i,,cnt) b[i]+=b[i-];
  100. rep(i,,cnt) bl[b[st[i]]--]=i;
  101.  
  102. rep(i,,cnt)
  103. {
  104. int p=bl[i];
  105. if(c[p]>=k) f[p]=f[fa[p]]+st[p]-st[fa[p]];
  106. else f[p]=f[fa[p]];
  107. }
  108. rep(i,,cas)
  109. {
  110. ll ans=;
  111. int u=;
  112. rep(j,,(int)s[i].size()-)
  113. {
  114. u=t[u][s[i][j]-'a'];
  115. ans+=f[u];
  116. }
  117. printf("%lld ",ans);
  118. }
  119.  
  120. }
  121. }sam;
  122.  
  123. int main()
  124. {
  125. cas=read(),k=read();
  126. rep(v,,cas)
  127. {
  128. cin>>s[v];
  129. np=;
  130. rep(i,,(int)s[v].size()-) sam.add(s[v][i]-'a');
  131. }
  132. sam.solve();
  133. return ;
  134. }

【BZOJ3473&BZOJ3277】字符串(广义后缀自动机)的更多相关文章

  1. 【bzoj3277/bzoj3473】串/字符串 广义后缀自动机

    题目描述 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 输入 第一行两个整数n,k.接下来n行每行一个 ...

  2. BZOJ 3473: 字符串 [广义后缀自动机]

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 354  Solved: 160[Submit][Status][Discuss] ...

  3. BZOJ3277: 串(广义后缀自动机)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1196  Solved: 478[Submit][Status][Discuss] Descripti ...

  4. BZOJ3473 字符串 广义后缀自动机

    今天主攻了下SAM 好多东西以前都没理解到 对于这道题 我们建一个自动机存所有串 每个穿last从1开始 对于自动机上每个点额外记一个cnt 表示能匹配到这个点的不同串个数 建完对每个串在自动机上匹配 ...

  5. BZOJ 3277 串 & BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)

    标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...

  6. BZOJ 3473 字符串 ——广义后缀自动机

    这题就比较有趣了. 首先匹配一遍,然后统计子树叶子节点中包含大于等于k的节点个数(HH的项链) 然后就可以搞了. 关于合法的情况数,显然是l[i]-l[fa[i]],然后向下下传即可(YY一下). # ...

  7. [bzoj3277==bzoj3473]出现k次子串计数——广义后缀自动机+STL

    Brief Description 给定n个字符串,对于每个字符串,您需要求出在所有字符串中出现次数大于等于k次的子串个数. Algorithm Design 先建立一个广义后缀自动机,什么是广义后缀 ...

  8. BZOJ3473 字符串 【广义后缀自动机】

    题目 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 输入格式 第一行两个整数n,k. 接下来n行每行一个字符串. 输出格式 一行n个整数,第i个整数表 ...

  9. bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...

  10. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...

随机推荐

  1. gradle自动化打包apk

    前堤是要在安卓项目中配置好gradle.build脚本 ## !/bin/sh ## 项目名 ##使配置文件生效,否则会报gradle:命令找不到 source /etc/profile TARGET ...

  2. linux下rpm包安装、配置和卸载mysq

    l   WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/red ...

  3. 16/7/14-MySQL-修改mysql5.6以上版本root密码

    版本更新,原来user里的password字段已经变更为authentication_string 版本更新 缘故,好多网上的教程都不适用了,甚至连官网的文档也不是能够顺利操作的. 如果 MySQL ...

  4. python匿名函数应用--动态计算器

    匿名函数: 一般用于函数体较为简单的运算,和一些不需要函数名的传递.  lambda 参数1:运算举例:  func = lambda x,y:x+y :可以给匿名函数添加变量名. 匿名函数的应用: ...

  5. jQuery基础--事件处理

    2. jQuery事件机制 JavaScript中已经学习过了事件,但是jQuery对JavaScript事件进行了封装,增加并扩展了事件处理机制.jQuery不仅提供了更加优雅的事件处理语法,而且极 ...

  6. no suitable HttpMessageConverter found for response type

    在使用 RestTemplate 或者 Spring Cloud 的时候,经常会出现这个错误. 基本上出现的场景都是,我们要json,结果来了个 text/html. 两个原因: 第一个就是:服务器返 ...

  7. php页面出现空白解决方法

    查询php程序使用内存情况 $size = memory_get_usage(); file_put_contents("d:/data.php", var_export($siz ...

  8. Matplotlib基础使用

    matplotlib 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 x轴和y轴 axis 水平和垂直的轴线 x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括最小刻度 ...

  9. 搞定Oracle SCN -system change number

    SCN是Oracle的内部时钟,用来反映数据库中所有变化,在运行过程中不断更新.SCN种类包括:      (1)系统当前SCN                   (2)Checkpoint SCN ...

  10. Oracle 汉字占用字节数

    在oracle中一个字符特别是中文字符占几个字节是与字符集有关的.      比如GBK,汉字就会占两个字节,英文1个:如果是UTF-8,汉字一般占3个字节,英文还是1个.但是一般情况下,我们都认为是 ...