题意:给定两个字符串,从中各取一个子串使之相同,有多少种取法。允许本质相同。

解:建立广义后缀自动机,对于每个串,分别统计cnt,之后每个点的cnt乘起来。记得开long long

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4.  
  5. typedef long long LL;
  6. const int N = ;
  7.  
  8. struct Edge {
  9. int nex, v;
  10. }edge[N << ]; int top;
  11.  
  12. int tr[N][], len[N], fail[N], cnt[N][], vis[N];
  13. int tot = , last, turn, e[N];
  14. char s[N], str[N];
  15.  
  16. inline void add(int x, int y) {
  17. top++;
  18. edge[top].v = y;
  19. edge[top].nex = e[x];
  20. e[x] = top;
  21. return;
  22. }
  23.  
  24. inline int split(int p, int f) {
  25. int Q = tr[p][f], nQ = ++tot;
  26. len[nQ] = len[p] + ;
  27. fail[nQ] = fail[Q];
  28. fail[Q] = nQ;
  29. memcpy(tr[nQ], tr[Q], sizeof(tr[Q]));
  30. while(tr[p][f] == Q) {
  31. tr[p][f] = nQ;
  32. p = fail[p];
  33. }
  34. return nQ;
  35. }
  36.  
  37. inline int insert(int p, char c) {
  38. int f = c - 'a';
  39. if(tr[p][f]) {
  40. int Q = tr[p][f];
  41. if(len[Q] == len[p] + ) {
  42. cnt[Q][turn] = ;
  43. return Q;
  44. }
  45. int t = split(p, f);
  46. cnt[t][turn] = ;
  47. return t;
  48. }
  49. int np = ++tot;
  50. len[np] = len[p] + ;
  51. cnt[np][turn] = ;
  52. while(p && !tr[p][f]) {
  53. tr[p][f] = np;
  54. p = fail[p];
  55. }
  56. if(!p) {
  57. fail[np] = ;
  58. }
  59. else {
  60. int Q = tr[p][f];
  61. if(len[Q] == len[p] + ) {
  62. fail[np] = Q;
  63. }
  64. else {
  65. fail[np] = split(p, f);
  66. }
  67. }
  68. return np;
  69. }
  70.  
  71. void DFS(int x) {
  72. for(int i = e[x]; i; i = edge[i].nex) {
  73. int y = edge[i].v;
  74. DFS(y);
  75. cnt[x][] += cnt[y][];
  76. cnt[x][] += cnt[y][];
  77. }
  78. return;
  79. }
  80.  
  81. int main() {
  82. scanf("%s%s", s, str);
  83. int n = strlen(s), last = ;
  84. for(int i = ; i < n; i++) {
  85. last = insert(last, s[i]);
  86. }
  87. n = strlen(str);
  88. last = turn = ;
  89. for(int i = ; i < n; i++) {
  90. last = insert(last, str[i]);
  91. }
  92. for(int i = ; i <= tot; i++) {
  93. add(fail[i], i);
  94. }
  95. DFS();
  96. int p = ;
  97. LL ans = ;
  98. for(int i = ; i <= tot; i++) {
  99. ans += 1ll * cnt[i][] * cnt[i][] * (len[i] - len[fail[i]]);
  100. }
  101.  
  102. printf("%lld", ans);
  103. return ;
  104. }

AC代码

bzoj4566 找相同字符的更多相关文章

  1. 【BZOJ4566】找相同字符(后缀数组)

    [BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...

  2. 【BZOJ4566】找相同字符(后缀自动机)

    [BZOJ4566]找相同字符(后缀自动机) 题面 BZOJ 题解 看到多串处理,\(SA\)就连起来 \(SAM???\) 单串建自动机 然后其他串匹配 对于一个串建完\(SAM\)后 另一个串在\ ...

  3. 【BZOJ4566】[HAOI2016]找相同字符

    [BZOJ4566][HAOI2016]找相同字符 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 其中\(1\le ...

  4. 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈

    [BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...

  5. BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机)

    BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机) 题面 自己找去 HINT 给定两个文本串,问从两个串中各取一个非空子串,使这俩子串相同,问方案有多少种.我的思路 ...

  6. BZOJ4566 [Haoi2016]找相同字符【SAM】

    BZOJ4566 [Haoi2016]找相同字符 给定两个字符串\(s和t\),要求找出两个字符串中所有可以相互匹配的子串对的数量 首先考虑可以怎么做,我们可以枚举\(t\)串的前缀\(t'\),然后 ...

  7. bzoj4566 / P3181 [HAOI2016]找相同字符

    P3181 [HAOI2016]找相同字符 后缀自动机 (正解应是广义后缀自动机) 并不会广义后缀自动机. 然鹅可以用普通的后缀自动机.   我们先引入一个问题:算出从一个串内取任意两个不重合子串完全 ...

  8. [BZOJ4566][Haoi2016]找相同字符 后缀自动机+dp

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1212  Solved: 694[Submit][Stat ...

  9. [Bzoj4566][Haoi2016]找相同字符(广义后缀自动机)

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 861  Solved: 495[Submit][Statu ...

随机推荐

  1. MHA高可用及读写分离

    一.MHA简介 二.工作流程 三.MHA架构图 四.MHA工具介绍 五.基于GTID的主从复制 六.部署MHA 七.配置VIP漂移 八.配置binlog-server 九.MySQL中间件Atlas

  2. MyBatis的demo

    把以前写的关于mybatis的demo放在这边,以便查看. 目录结构: package com.test.mybatis.util; import java.io.IOException; impor ...

  3. jenkins结合svn检测版本变化执行shell脚本实现项目部署

    工具: centos 7 jenkins-2.138.2-1.1.noarch.rpm,2018年10月10号最新版(简单rpm包安装见https://www.cnblogs.com/dannylin ...

  4. 莫烦scikit-learn学习自修第三天【通用训练模型】

    1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ import numpy as np from sklearn import datasets ...

  5. C-Lodop提示“网页还没下载完毕,请稍等一下再操作.”

    该提示在Lodop旧版本中是: 提示"WebSocket没准备好,点确定继续",提示“C-Lodop没准备好”,新版本修改了该提示的描述“网页还没下载完毕,请稍等一下再操作.”,让 ...

  6. Cherry.chen window.clipboardData实现剪切板操作总结 (好像只有ie好用)

    window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataForma ...

  7. ASP.NET Core Building chat room using WebSocket

    Creating “Login form” We use here simple form where user can insert his or her preferred nick name f ...

  8. bzoj4152-[AMPPZ2014]The_Captain

    Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...

  9. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

  10. 大学jsp实验七--JavaBean在JSP中的应用

    值bean的应用 (1)若有如下图所示的两个JSP页面,在第一个的页面的表单中填写相应内容,提交后再显示用户的提交信息.使用JavaBean的方式实现上述效果,请写出相应的代码. bean文件:Tes ...