题意:给3个字符串,问从1到min(l1,l2,l3)的长度的子串,找到从该位置长度为l,三个子串相同的三元组的个数

题解:把3个子串用分隔符串起来.然后分开统计每个节点在三个串中出现次数.最后乘起来就是该节点表示的三元组个数,然后l[fa[i]]+1到l[i]有贡献,对l差分一下就好了

  1. //#pragma GCC optimize(2)
  2. //#pragma GCC optimize(3)
  3. //#pragma GCC optimize(4)
  4. //#pragma GCC optimize("unroll-loops")
  5. //#pragma comment(linker, "/stack:200000000")
  6. //#pragma GCC optimize("Ofast,no-stack-protector")
  7. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  8. #include<bits/stdc++.h>
  9. #define fi first
  10. #define se second
  11. #define db double
  12. #define mp make_pair
  13. #define pb push_back
  14. #define pi acos(-1.0)
  15. #define ll long long
  16. #define vi vector<int>
  17. #define mod 1000000007
  18. #define ld long double
  19. //#define C 0.5772156649
  20. //#define ls l,m,rt<<1
  21. //#define rs m+1,r,rt<<1|1
  22. #define pll pair<ll,ll>
  23. #define pil pair<int,ll>
  24. #define pli pair<ll,int>
  25. #define pii pair<int,int>
  26. #define ull unsigned long long
  27. //#define base 1000000000000000000
  28. #define fin freopen("a.txt","r",stdin)
  29. #define fout freopen("a.txt","w",stdout)
  30. #define fio ios::sync_with_stdio(false);cin.tie(0)
  31. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  32. inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
  33. inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
  34. template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
  35. template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
  36. inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
  37. inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
  38. using namespace std;
  39. const ull ba=233;
  40. const db eps=1e-5;
  41. const ll INF=0x3f3f3f3f3f3f3f3f;
  42. const int N=300000+10,maxn=1000000+10,inf=0x3f3f3f3f;
  43. char s[N];
  44. struct SAM{
  45. int last,cnt;
  46. int ch[N<<1][27],fa[N<<1],l[N<<1],sz[N<<1][3];
  47. int a[N<<1],c[N<<1];
  48. ll dp[N<<1];
  49. void ins(int c,int id){
  50. int p=last,np=++cnt;last=np;l[np]=l[p]+1;
  51. for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
  52. if(!p)fa[np]=1;
  53. else
  54. {
  55. int q=ch[p][c];
  56. if(l[p]+1==l[q])fa[np]=q;
  57. else
  58. {
  59. int nq=++cnt;l[nq]=l[p]+1;
  60. memcpy(ch[nq],ch[q],sizeof(ch[q]));
  61. fa[nq]=fa[q];fa[q]=fa[np]=nq;
  62. for(;ch[p][c]==q;p=fa[p])ch[p][c]=nq;
  63. }
  64. }
  65. if(id>=0)sz[np][id]=1;
  66. }
  67. void topo()
  68. {
  69. for(int i=1;i<=cnt;i++)c[l[i]]++;
  70. for(int i=1;i<=cnt;i++)c[i]+=c[i-1];
  71. for(int i=1;i<=cnt;i++)a[c[l[i]]--]=i;
  72. }
  73. void build(){
  74. last=cnt=1;
  75. int mi=inf;
  76. for(int i=0;i<3;i++)
  77. {
  78. scanf("%s",s);
  79. mi=min(mi,(int)strlen(s));
  80. for(int j=0;s[j];j++)ins(s[j]-'a',i);
  81. ins(26,-1);
  82. }
  83. topo();
  84. for(int i=cnt;i;i--)for(int j=0;j<3;j++)sz[fa[a[i]]][j]+=sz[a[i]][j];
  85. for(int i=1;i<=cnt;i++)
  86. {
  87. ll te=1ll*sz[i][0]*sz[i][1]%mod*sz[i][2]%mod;
  88. add(dp[l[fa[i]]+1],te);
  89. sub(dp[l[i]+1],te);
  90. }
  91. for(int i=1;i<=mi;i++)add(dp[i+1],dp[i]),printf("%lld\n",dp[i]);
  92. }
  93. }sam;
  94. int main()
  95. {
  96. sam.build();
  97. return 0;
  98. }
  99. /********************
  100. ********************/

MemSQL Start[c]UP 2.0 - Round 1E. Three strings的更多相关文章

  1. 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 ...

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

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

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

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

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

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

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

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

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

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

  7. 【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 ...

  8. 【MemSQL Start[c]UP 3.0 - Round 1 B】 Lazy Security Guard

    [链接]h在这里写链接 [题意] 围成对应面积的方块最少需要多少条边. [题解] 有特定的公式的. 2*ceil(2*根号下(n)); -> 自己找下规律也很简单的. [错的次数] 0 [反思] ...

  9. 【MemSQL Start[c]UP 3.0 - Round 1 A】 Declined Finalists

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] max(最大值-25,0) [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> ...

随机推荐

  1. HVP plan

    HVP,hier verification plan,建立整个验证的plan,在验证后期,通过vcs的coverage db可以直接进行反标, 包括反标code coverage,function c ...

  2. Excel坐标自动在AutoCad绘图_6

    众所周知,Excel对数据处理的功能非常强大,它可以进行数据处理.统计分析已经辅助决策的操作,该软件已经渗透到各个领域.作为一个测绘人,GISer, 也经常利用excel完成一些测量表格的自动化计算, ...

  3. jquery.uploadify上传插件HTML5版中文api使用说明

    插件官网文档:http://www.uploadify.com/documentation/ H5版下载地址:https://download.csdn.net/download/u010075697 ...

  4. MVC(I)

    实际开发我们是这样的:

  5. MariaDB导入XXX.sql文件

    使用的 MariaDB5.5.52 开启数据库服务: systemctl start mariadb 要使用该脚本,登录数据, mysql -u root -p 根据提示输入你安装数据库时需设置密码, ...

  6. tiny6410 启动参数

    baudrate=115200 bootargs=noinitrd root=/dev/nfs nfsroot=192.168.1.116:/home/suxuandong/Documents/com ...

  7. linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试  要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特 ...

  8. [转载]Oracle之xml的增删改查操作

    tip: xmltype函数是将clob字段转成xmltype类型的函数,若字段本身为xmltype类型则不需要引用xmltype()函数 同名标签用数组取值的方式获取,但起始值从1开始 一.查询(Q ...

  9. css学习-》养成路线

    雅虎工程师提供的CSS初始化示例代码 body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input, ...

  10. 对于react-redux的理解

    一.redux与组件 React-Redux提供connect方法,用于从UI组件生成容器组件 二.react-redux的基本使用 1.引入 import {Provider} from " ...