E - Three strings

将三个串加进去,看每个节点在三个串中分别出现了多少次。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define PII pair<int, int>
  7. #define PLI pair<LL, int>
  8. #define ull unsigned long long
  9. using namespace std;
  10.  
  11. const int N = 5e5 + ;
  12. const int inf = 0x3f3f3f3f;
  13. const LL INF = 0x3f3f3f3f3f3f3f3f;
  14. const int mod = 1e9 + ;
  15. const double eps = 1e-;
  16.  
  17. int n, ans[N], len[];
  18. char s[][N];
  19.  
  20. struct SuffixAutomaton {
  21. int cur, cnt, ch[N<<][], id[N<<], fa[N<<], dis[N<<], sz[N<<], c[N];
  22. int num[][N<<];
  23. SuffixAutomaton() {cur = cnt = ;}
  24. void init() {
  25. for(int i = ; i <= cnt; i++) {
  26. memset(ch[i], , sizeof(ch[i]));
  27. sz[i] = c[i] = dis[i] = fa[i] = ;
  28. }
  29. cur = cnt = ;
  30. }
  31. int extend(int p, int c) {
  32. cur = ++cnt; dis[cur] = dis[p]+;
  33. for(; p && !ch[p][c]; p = fa[p]) ch[p][c] = cur;
  34. if(!p) fa[cur] = ;
  35. else {
  36. int q = ch[p][c];
  37. if(dis[q] == dis[p]+) fa[cur] = q;
  38. else {
  39. int nt = ++cnt; dis[nt] = dis[p]+;
  40. memcpy(ch[nt], ch[q], sizeof(ch[q]));
  41. fa[nt] = fa[q]; fa[q] = fa[cur] = nt;
  42. for(; ch[p][c]==q; p=fa[p]) ch[p][c] = nt;
  43. }
  44. }
  45. sz[cur] = ;
  46. return cur;
  47. }
  48. void topo(int n) {
  49. for(int i = ; i <= cnt; i++) c[dis[i]]++;
  50. for(int i = ; i <= n; i++) c[i] += c[i-];
  51. for(int i = cnt; i >= ; i--) id[c[dis[i]]--] = i;
  52. }
  53. void solve() {
  54. for(int i = ; i < ; i++) {
  55. scanf("%s", s[i]); len[i] = strlen(s[i]);
  56. for(int j = , last = ; j < len[i]; j++)
  57. last = extend(last, s[i][j]-'a');
  58. }
  59. for(int i = ; i < ; i++) {
  60. for(int j = , p = ; j < len[i]; j++) {
  61. p = ch[p][s[i][j]-'a'];
  62. num[i][p]++;
  63. }
  64. }
  65. topo(max(len[], max(len[], len[])));
  66. for(int i = cnt; i >= ; i--)
  67. for(int j = ; j < ; j++)
  68. num[j][fa[id[i]]] += num[j][id[i]];
  69. for(int i = ; i <= cnt; i++) {
  70. int ret = 1ll*num[][i]*num[][i]%mod*num[][i]%mod;
  71. int mx = dis[i], mn = dis[fa[i]]+;
  72. ans[mn] = (ans[mn] + ret) % mod;
  73. ans[mx+] = (ans[mx+]-ret+mod)%mod;
  74. }
  75. int Len = min(len[], min(len[], len[]));
  76. for(int i = ; i <= Len; i++) {
  77. ans[i] = (ans[i] + ans[i-]) % mod;
  78. printf("%d ", ans[i]);
  79. }
  80. puts("");
  81. }
  82. } sam;
  83.  
  84. int main() {
  85. sam.solve();
  86. return ;
  87. }
  88.  
  89. /*
  90. */

MemSQL Start[c]UP 2.0 - Round 1 E - Three strings 广义后缀自动机的更多相关文章

  1. Codeforces Round #364 (Div. 1) (差一个后缀自动机)

    B. Connecting Universities 大意: 给定树, 给定2*k个点, 求将2*k个点两两匹配, 每个匹配的贡献为两点的距离, 求贡献最大值 单独考虑每条边$(u,v)$的贡献即可, ...

  2. MemSQL Start[c]UP 2.0 - Round 1(无聊练手B题)

    http://codeforces.com/contest/452/problem/B   B. 4-point polyline time limit per test 2 seconds memo ...

  3. MemSQL Start[c]UP 2.0 - Round 2 - Online Round

    搞到凌晨4点一个没出,要gg了. A. Golden System http://codeforces.com/contest/458/problem/A #include<cstdio> ...

  4. MemSQL Start[c]UP 2.0 - Round 1

    A. Eevee http://codeforces.com/contest/452/problem/A 字符串水题 #include<cstdio> #include<cstrin ...

  5. MemSQL Start[c]UP 2.0 - Round 2

    反正晚上睡不着,熬到1点开始做比赛,6个题目只做了2个题目,而且手速还比较慢,待提升空间还很大呢. A题:给定两个0,1串(len<=100000), 但是不是普通的二进制串,而是q进制串,q ...

  6. MemSQL Start[c]UP 2.0 - Round 1E. Three strings

    题意:给3个字符串,问从1到min(l1,l2,l3)的长度的子串,找到从该位置长度为l,三个子串相同的三元组的个数 题解:把3个子串用分隔符串起来.然后分开统计每个节点在三个串中出现次数.最后乘起来 ...

  7. Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E

    题意:减前面的数,加后面的数,保证最后不剩下数,加减次数要相同: 题解:emmmmm,看出是个贪心,先对价值排序,相同就对下标排序,规律是每次找第一个,然后从后往前找没有使用过的下表比他大的第一个,相 ...

  8. 【MemSQL Start[c]UP 3.0 - Round 1 E】Desk Disorder

    [链接]h在这里写链接 [题意] 有N个人. 2N个座位. 现在告诉你这N个人它们现在的座位.以及它们想去的座位. 每个人可以去它们想去的座位或者就站在原地不动. 新的座位和旧的座位,都不允许一个座位 ...

  9. 【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules

    [链接]h在这里写链接 [题意] 在这里写题意 [题解]     dp[i][0] 第i个位置,bob没有决策权     dp[i][1] 第i个位置,bob有决策权     dp[n][0] = 0 ...

随机推荐

  1. HTTP协议(2)-------- 网络编程

    1. HTTP请求格式 做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干.HTTP协议传输的消息 ...

  2. HDU 4311 Meeting point-1 求一个点到其它点的曼哈顿距离之和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4311 解题报告:在一个平面上有 n 个点,求一个点到其它的 n 个点的距离之和最小是多少. 首先不得不 ...

  3. JS设计模式——11.适配器模式

    适配器模式概述 适配器模式可用来在现有接口和不兼容的类之间进行适配.使用这种模式的对象又叫包装器(wrapper). 适配器特点 从表面看,适配器模式很像门面模式.她们都要对别的对象进行包装并改变其呈 ...

  4. 小白欢乐多——记ssctf的几道题目

    小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...

  5. aarch64_n3

    ntp-doc-4.2.8p10-1.fc26.noarch.rpm 2017-03-24 02:07 1.2M fedora Mirroring Project ntp-perl-4.2.8p10- ...

  6. HDU 6196 happy happy happy 爆搜加剪枝

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6196 题意:给你长度为n的序列,爸爸和儿子玩一个游戏,儿子先手,儿子每次都选择最左边与最右边最大的那个 ...

  7. 09 Command Documentation 命令文档

    Command Documentation 命令文档   There is a suite of programs to build and process Go source code. Inste ...

  8. 美国部分科技公司创始及IPO信息

    作者:Ben.Z 时间:2018-04-19 做这份统计表格的目的是为了更好地了解当下美国的IT发展,搞清楚那些耳熟能详的名词的来源. 原文是用WPS统计的,本文仅展示截图. 创始人年龄分析: 1.上 ...

  9. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

  10. day03作业

    ---恢复内容开始--- 1.+.-.*./.%.++.-- ①正号:②加法运算:③连接符 除法是两个数相除所得的结果,取余是除法操作的余数. ++前置表示现将一个数自加然后进行赋值,++后置表示先赋 ...