传送门

Description

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

Solution

考虑用SAM,采用较为轻松的姿势

首先中加个特殊符号,把连个字符串接在一起

SAM的每个节点都存下了一些子串,我们分别记下它在\(s_1\)和\(s_2\)中出现的次数

那么每个状态它给答案的贡献是

\[(step[i]-step[fa[i]]) × siz_{s_1}[i]×siz_{s_2}[i]
\]

Code 

  1. //2019.1.25 23:00~23:18
  2. #include<bits/stdc++.h>
  3. #define ll long long
  4. #define max(a,b) ((a)>(b)?(a):(b))
  5. #define min(a,b) ((a)<(b)?(a):(b))
  6. #define MN 200005
  7. char s[MN];
  8. class SAM
  9. {
  10. #define MX 800005
  11. private:
  12. int last,cnt,fa[MX],v[MX],rk[MX],val[MX][2],c[MX][27],step[MX];ll ans;
  13. public:
  14. SAM(int _=1):last(_),cnt(_){}
  15. inline void Insert(int x,bool pos)
  16. {
  17. int p=last,np=++cnt;step[np]=step[p]+1;val[np][pos]=1;
  18. for(;p&&!c[p][x];p=fa[p]) c[p][x]=np;
  19. if(!p) fa[np]=1;
  20. else
  21. {
  22. int q=c[p][x];
  23. if(step[q]==step[p]+1) fa[np]=q;
  24. else
  25. {
  26. int nq=++cnt;
  27. fa[nq]=fa[q];fa[np]=fa[q]=nq;
  28. memcpy(c[nq],c[q],sizeof c[nq]);
  29. step[nq]=step[p]+1;
  30. for(;c[p][x]==q;p=fa[p]) c[p][x]=nq;
  31. }
  32. }
  33. last=np;
  34. }
  35. inline void Query()
  36. {
  37. register int i;
  38. for(i=1;i<=cnt;++i) ++v[step[i]];
  39. for(i=1;i<=step[last];++i) v[i]+=v[i-1];
  40. for(i=1;i<=cnt;++i) rk[v[step[i]]--]=i;
  41. for(i=cnt;i;--i)
  42. {
  43. val[fa[rk[i]]][0]+=val[rk[i]][0];
  44. val[fa[rk[i]]][1]+=val[rk[i]][1];
  45. ans+=1ll*val[rk[i]][0]*val[rk[i]][1]*(step[rk[i]]-step[fa[rk[i]]]);
  46. }
  47. val[1][0]=val[1][1]=0;
  48. printf("%lld\n",ans);
  49. }
  50. }pac;
  51. int main()
  52. {
  53. scanf("%s",s+1);
  54. register int n=strlen(s+1),i;
  55. for(i=1;i<=n;++i) pac.Insert(s[i]-'a',0);
  56. pac.Insert(26,0);
  57. scanf("%s",s+1);n=strlen(s+1);
  58. for(i=1;i<=n;++i) pac.Insert(s[i]-'a',1);
  59. pac.Query();
  60. return 0;
  61. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[bzoj 4566][Haoi 2016]找相同字符的更多相关文章

  1. [HAOI 2016]找相同字符

    Description 题库链接 给定两个只含小写字母字符串 \(s_1,s_2\) ,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. \ ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)

    [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...

随机推荐

  1. manacher 算法(最长回文串)

    manacher算法: 定义数组p[i]表示以i为中心的(包含i这个字符)回文串半径长 将字符串s从前扫到后for(int i=0;i<strlen(s);++i)来计算p[i],则最大的p[i ...

  2. Python基本数据类型及实例详解

    Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对 ...

  3. 【转载】Windows检测到IP地址冲突

    今天在使用电脑的过程中,突然弹出个提示,Windows检测到IP地址冲突,此网络中的另一台计算机与该计算机的IP地址相同.联系你的网络管理员解决此问题,有关详细信息,请参阅Windows系统日志.查阅 ...

  4. ElementUI对话框(dialog)提取为子组件

    需求:在页面的代码太多,想把弹窗代码提取为子组件,复用也方便.   这里涉及到弹窗el-dialog的一个属性show-close: show-close="false"是设置不显 ...

  5. 2.synchronized同步锁

    原文链接:http://blog.csdn.net/zteny/article/details/54863391 简介 synchronized是Java语言的一个关键字,用来修饰一个方法或者代码块, ...

  6. 爬虫:selenium请求库

    一.介绍 二.安装 三.基本使用 四.选择器 五.等待元素被加载 六.元素交互操作 七.其他 八.项目练习 一.介绍 # selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requ ...

  7. zabbix 3.2.2 server web展示如何显示中文 (三)

    1.确认zabbix是否开启了中文支持功能(/var/www/html/zabbix/include/locales.inc.php) 2.登录zabbix后,点击可爱的小公主吧 Admin(zabb ...

  8. CUDA中确定你显卡的thread和block数

    CUDA中确定你显卡的thread和block数 在进行并行计算时, 你的显卡所支持创建的thread数与block数是有限制的, 因此, 需要自己提前确定够用, 再进行计算, 否则, 你需要改进你的 ...

  9. 用js刷剑指offer(二叉搜索树与双向链表)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...

  10. 团队第六次作业-Beta冲刺及发布说明

    1.相关信息 Q A 作业所属课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 作业要求 https: ...