后缀自动姬好,好写好调好ac

原题:

给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两
个子串中有一个位置不同。
1 <=n1, n2<= 20000
 
之前写了个后缀数组+并查集的,因为我只会后缀数组……
后看看dalao们纷纷使用后缀自动姬秒题,决定提高一下自己姿势水平,学一发后缀自动姬
然后根本无法理解啊quq,现在板子差不多理解了,但是自动姬上做DP的延伸还是不能理解quq
多做题应该就能理解了吧……
这题dp具体思路是啥我也没搞懂,直接上结论
每个点的贡献:|right(x)|*(max[x]-max[fa[x]])
具体贡献到答案上,就搞一个b在当前节点上匹配的公共长度l,然后对答案的贡献就是|right(x)|*(l-max[fa[x]])
代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. #define ll long long
  8. int rd(){int z=,mk=; char ch=getchar();
  9. while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
  10. while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
  11. return z*mk;
  12. }
  13. char a[],b[]; int n,m;
  14. int nxt[][],fa[],mx[],sz[];
  15. int lst=,tt=;
  16. int cnt[],cntrk[];
  17. ll f[];
  18. void ist(int x){
  19. int p=lst,np=lst=++tt;
  20. mx[np]=mx[p]+; sz[np]=;
  21. while(!nxt[p][x] && p) nxt[p][x]=np,p=fa[p];
  22. if(!p) fa[np]=;
  23. else{
  24. int q=nxt[p][x];
  25. if(mx[p]+==mx[q]) fa[np]=q;
  26. else{
  27. int nq=++tt; mx[nq]=mx[p]+;
  28. memcpy(nxt[nq],nxt[q],sizeof(nxt[q]));
  29. fa[nq]=fa[q],fa[q]=fa[np]=nq;
  30. while(nxt[p][x]==q) nxt[p][x]=nq,p=fa[p];
  31. }
  32. }
  33. }
  34. void gtcntrk(){
  35. for(int i=;i<=tt;++i) ++cnt[mx[i]];
  36. for(int i=;i<=n;++i) cnt[i]+=cnt[i-];
  37. for(int i=tt;i;--i) cntrk[cnt[mx[i]]--]=i;
  38. }
  39. void gtf(){
  40. for(int i=tt;i;--i) sz[fa[cntrk[i]]]+=sz[cntrk[i]];
  41. for(int i=;i<=tt;++i)
  42. f[cntrk[i]]=f[fa[cntrk[i]]]+(ll)sz[cntrk[i]]*(mx[cntrk[i]]-mx[fa[cntrk[i]]]);
  43. }
  44. int main(){//freopen("ddd.in","r",stdin);
  45. scanf("%s%s",a+,b+); n=strlen(a+),m=strlen(b+);
  46. for(int i=;i<=n;++i) ist(a[i]-'a');
  47. gtcntrk(),gtf();
  48. ll bwl=; int l=,tmp=,x;
  49. for(int i=;i<=m;++i){
  50. x=b[i]-'a';
  51. if(nxt[tmp][x]) tmp=nxt[tmp][x],++l;
  52. else{
  53. while(!nxt[tmp][x] && tmp) tmp=fa[tmp];
  54. if(!tmp) tmp=,l=;
  55. else l=mx[tmp]+,tmp=nxt[tmp][x];
  56. }
  57. if(tmp!=) bwl+=f[fa[tmp]]+(ll)sz[tmp]*(l-mx[fa[tmp]]);
  58. }
  59. cout<<bwl<<endl;
  60. return ;
  61. }

【BZOJ4566】【HAOI2016】找相同字符的更多相关文章

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

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

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

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

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

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

  4. BZOJ4566 [Haoi2016]找相同字符 字符串 SAM

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4566.html 题目传送门 - BZOJ4566 题意 给定两个字符串 $s1$ 和 $s2$ ,问有 ...

  5. BZOJ4566: [Haoi2016]找相同字符

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  6. BZOJ4566: [Haoi2016]找相同字符(后缀自动机)

    题意 题目链接 Sol 直接在SAM上乱搞 枚举前缀,用SAM统计可以匹配的后缀,具体在匹配的时候维护和当前节点能匹配的最大值 然后再把parent树上的点的贡献也统计上,这部分可以爆跳parent树 ...

  7. BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  8. BZOJ4566:[HAOI2016]找相同字符(SAM)

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别 ...

  9. BZOJ4566 [Haoi2016]找相同字符 【后缀数组】

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

  10. BZOJ4566 HAOI2016找相同字符(后缀自动机)

    对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...

随机推荐

  1. python 学习 map /reduce

    python 内建了map()和reduce()函数 map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. ...

  2. cocos2d方块方块

    cGridSize=32 cSceneWidth=8+2 cSceneHeight=18 fuction Grid2Pos(x,y) local visibleSize=cc.Director:get ...

  3. python if elif else判断语句

    username = 'jack' password = ' _username = input('username') _password = input('password') if userna ...

  4. maven scope和项目发布需要注意的地方

    Maven Scope的使用: http://www.cnblogs.com/wangyonghao/p/5976055.html servlet-api和jsp-api等jar包,一般由servle ...

  5. 外部点击链接,登陆后,直接跳转到该链接(过滤器 + Cookie实现)

    一.web.xml (1)指定过滤的Servlet类 (2)配置过滤规则,过滤以.mail结尾的链接 <?xml version="1.0" encoding="U ...

  6. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  7. Invalid MEX-file: caffe.mexa64 的解决方案

    http://blog.csdn.net/iamzhangzhuping/article/details/53105708

  8. bootstrap动态生成层级ul-li 新闻预览 常用方法

    <div class="row" id="add-withinfosortId-row" style="display: none"& ...

  9. hdu3861 强连通分量缩点+二分图最最小路径覆盖

    The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. javascript动态加载js文件主流浏览器兼容版

    一.代码示例: <html> <head> <meta http-equiv="Content-Type" content="text/ht ...