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

每个后缀结尾处 ct[ ] = 1 ,按拓扑序 dp 一下就能求出 right 集合的大小。自动机上每个点的贡献就是 ( l [cr]-l [fa] ) * ct[0][cr] * ct[1][cr] , ct[0] 和 ct[1] 表示在两个字符串里分别的出现次数。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ll long long
  5. using namespace std;
  6. const int N=2e5+,M=8e5+,K=;
  7. int tot=,go[M][K],fa[M],l[M],ct[][M],ans[M];
  8. char s[][N]; int q[M],tx[N],vis[M];
  9. int cz(int p,int w)
  10. {
  11. int q=go[p][w],nq=++tot;l[nq]=l[p]+;
  12. fa[nq]=fa[q];fa[q]=nq;
  13. memcpy(go[nq],go[q],sizeof go[q]);
  14. for(;p&&go[p][w]==q;p=fa[p])go[p][w]=nq;
  15. return nq;
  16. }
  17. int ins(int p,int w)
  18. {
  19. if(go[p][w])
  20. {
  21. int q=go[p][w];
  22. if(l[q]==l[p]+)return q; return cz(p,w);
  23. }
  24. int np=++tot;l[np]=l[p]+;
  25. for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
  26. if(!p)fa[np]=;
  27. else
  28. {
  29. int q=go[p][w];
  30. if(l[q]==l[p]+)fa[np]=q;
  31. else fa[np]=cz(p,w);
  32. }
  33. return np;
  34. }
  35. void Rsort(int n)
  36. {
  37. for(int i=;i<=tot;i++)tx[l[i]]++;
  38. for(int i=;i<=n;i++)tx[i]+=tx[i-];
  39. for(int i=;i<=tot;i++)q[tx[l[i]]--]=i;
  40. }
  41. int main()
  42. {
  43. scanf("%s",s[]);scanf("%s",s[]);
  44. int n[];n[]=strlen(s[]);n[]=strlen(s[]);
  45. for(int t=;t<=;t++)
  46. for(int pr=,i=;i<n[t];i++)pr=ins(pr,s[t][i]-'a'),ct[t][pr]=;
  47. Rsort(max(n[],n[])); ll prn=;
  48. for(int i=tot,d;i;i--)
  49. {
  50. for(int t=;t<=;t++)ct[t][fa[d=q[i]]]+=ct[t][d];
  51. prn+=(ll)(l[d]-l[fa[d]])*ct[][d]*ct[][d];
  52. }
  53. printf("%lld\n",prn);
  54. return ;
  55. }

bzoj 4566 [Haoi2016]找相同字符——广义后缀自动机的更多相关文章

  1. BZOJ 4566 [Haoi2016]找相同字符 ——广义后缀自动机

    建立广义后缀自动机. 然后统计子树中的siz,需要分开统计 然后对(l[i]-l[fa[i]])*siz[i][0]*siz[i][1]求和即可. #include <cstdio> #i ...

  2. [HAOI2016]找相同字符 广义后缀自动机_统计出现次数

    题目描述:给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式输入格式:两行,两个字符串 s1,s2,长度分别为n ...

  3. BZOJ_4566_[Haoi2016]找相同字符_后缀自动机

    BZOJ_4566_[Haoi2016]找相同字符_后缀自动机 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有 ...

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

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

  5. BZOJ 4566: [Haoi2016]找相同字符 [后缀自动机]

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

  6. bzoj 4566 [Haoi2016]找相同字符SA

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 128  Solved: 75[Submit][Status ...

  7. bzoj 4566 找相同字符 —— 广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机: 统计每个点在两个串中出现次数的子树和,其实就是在两个串中 ...

  8. ●BZOJ 4566 [Haoi2016]找相同字符

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4566题解: 广义后缀自动机 对两个串同时建立一个广义后缀自动机. 同时统计出每个状态对两个串 ...

  9. BZOJ.4566.[HAOI2016]找相同字符(后缀数组 单调栈)

    题目链接 给定两个字符串,求它们有多少个相同子串.相同串的位置不同算多个. POJ3145简化版. 后缀自动机做法见这儿,又快又好写(一下就看出差距了..) //13712kb 4076ms #inc ...

随机推荐

  1. Java容器——Map接口

    1.定义 Map用于保存存在映射关系<key, value>的数据.其中key值不能重复(使用equals()方法比较),value值可以重复. 2.常用实现类 HashMap:和Hash ...

  2. 简话Angular 05 Angular表单验证

    一句话: 可以使用所有html5表单验证功能,同时Angular还增强了部分验证,支持动态验证 1. 上源码 <div ng-controller="ExampleController ...

  3. spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战

    SpringBoot + Redis +SpringSession 缓存之实战 前言 前几天,从师兄那儿了解到EhCache是进程内的缓存框架,虽然它已经提供了集群环境下的缓存同步策略,这种同步仍然需 ...

  4. 查看dll导出函数的方法

    1.使用VS自带工具: (1)进入VS开发环境,然后Tools -> Visual studio 2015 Command Prompt,打开兼容工具命令提示符, (2)cd到dll所在目录,输 ...

  5. 微信小程序wx.chooseImage和wx.previewImage的综合使用(图片上传可以限制个数)

    本例从微信小程序的组件扒下来的. WXML: <view class="weui-cell"> <view class="weui-cell__bd&q ...

  6. jsonp 跨域2

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. vue react自动更新修改的代码

    利用node 引入 nodemon,我们项目修改了代码,就不用需要在重新启动 步骤 npm install --save-dev nodemon 执行 nodemon server.js      / ...

  8. 14 printf输出格式及栈空间分配

    假设在一个32位的 little endian的机器上运行下面程序,输出结果:1 0 2 #include<stdio.h> int main() { ,b=,c=; printf(&qu ...

  9. Python正则表达式操作指南

    摘要 本文是通过Python的 re 模块来使用正则表达式的一个入门教程,和库参考手册的对应章节相比,更为浅显易懂.循序渐进. 本文可以从 http://www.amk.ca/python/howto ...

  10. JDBC事务控制管理(转载)

    JDBC事务控制管理 转载于 2018年01月26日 15:46:11 1.事务 (1)事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐, ...