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

建出两个串的广义后缀自动机;

统计每个点在两个串中出现次数的子树和,其实就是在两个串中的 right 集合大小;

然后统计答案乘起来即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=8e5+5;
int n,m,cnt=1,fa[xn],go[xn][30],l[xn],tax[xn],q[xn],d1[xn],d2[xn];
char dc[xn];
int work(int p,int w)
{int nq=++cnt,q=go[p][w]; l[nq]=l[p]+1;fa[nq]=fa[q]; fa[q]=nq;memcpy(go[nq],go[q],sizeof go[q]);for(;p&&go[p][w]==q;p=fa[p])go[p][w]=nq;return nq;
}
int ext(int p,int w)
{if(go[p][w]){int q=go[p][w];if(l[q]==l[p]+1)return q; return work(p,w);}int np=++cnt; l[np]=l[p]+1;for(;p&&!go[p][w];p=fa[p])go[p][w]=np;if(!p)fa[np]=1;else {int q=go[p][w];if(l[q]==l[p]+1)fa[np]=q;else fa[np]=work(p,w);}return np;
}
void rsort()
{for(int i=1;i<=cnt;i++)tax[l[i]]++;for(int i=1;i<=cnt;i++)tax[i]+=tax[i-1];for(int i=cnt;i;i--)q[tax[l[i]]--]=i;
}
int main()
{scanf("%s",dc); n=strlen(dc);for(int lst=1,i=0;i<n;i++)lst=ext(lst,dc[i]-'a'+1),d1[lst]++;scanf("%s",dc); m=strlen(dc);for(int lst=1,i=0;i<n;i++)lst=ext(lst,dc[i]-'a'+1),d2[lst]++; rsort();for(int i=cnt,x;i;i--)d1[fa[x=q[i]]]+=d1[x],d2[fa[x]]+=d2[x];ll ans=0;for(int i=1;i<=cnt;i++)ans+=(ll)(l[i]-l[fa[i]])*d1[i]*d2[i];printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/10291146.html

bzoj 4566 找相同字符 —— 广义后缀自动机相关推荐

  1. 【bzoj4566】[Haoi2016]找相同字符【后缀自动机】

    题目传送门 题解:在文本串上建后缀自动机,用模式串在后缀自动机上跑.扫一遍模式串,在后缀自动机上走,走不了就跳fail再走. 走的过程中,维护模式串与文本串匹配的最大长度,并且统计答案. 怎么统计答案 ...

  2. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

  3. BZOJ.3277.串(广义后缀自动机)

    题目链接 \(Description\) 给定n个串和K,求每个串中有多少个子串是这n个串中至少K个串的子串. \(Solution\) 同上题,我们可以算出每个节点所代表的串出现在了几个串中:而且我 ...

  4. BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)

    题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...

  5. BZOJ5137lg4081(广义后缀自动机,set启发式合并)

    BZOJ5137&&lg4081(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 给定多个文本串,让你查询每个文本串中有多少个本质不同的子串且这个子串只出现在当前这个文本 ...

  6. BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并)

    BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并) 题目链接 题意 nnn个字符串,询问每个字符串一共有几个子串至少出现在nnn个字符串中的kkk个 思路: 拓扑 建广义后缀自动机, dp ...

  7. 牛客多校4 - Count New String(序列自动机+广义后缀自动机)

    题目链接:点击查看 题目大意: 题目分析:首先观察到集集合 A 中那个套娃的表示,外层的范围是 [ x1 , y1 ] ,内层是 [ x2 , y2 ] ,而内层的定义域实际上是包含在外层的定义域内的 ...

  8. BZOJ3172lg3966 TJOI单词(广义后缀自动机)

    BZOJ3172&&lg3966 TJOI单词(广义后缀自动机) 题面 自己找去 HINT 给出多个文本串,让你查找每个文本串一共出现了多少次,广义后缀自动机建出parent tree ...

  9. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

最新文章

  1. 算法基础(09)— 字符串常用操作
  2. 解决jre生成错误的问题
  3. 一个利用正则表达式进行代码重构,去除冗余代码的例子
  4. C# Timer定时器用法
  5. 【java基础知识】java打包运行时显示控制台内容
  6. linux下部署jdk+Tomcat
  7. Linux下安装配置PHP环境(上)---Apache2
  8. 设计模式:第二章--抽象工厂模式
  9. 【剑指offer】最小的K个数
  10. Ajax 加载数据 练习 自我有些迷糊了,写的大概请谅解 ^ _ ^
  11. 研究黑洞内部的一种方法
  12. Hbase API学习
  13. 使用matlab生成含正弦波表数据ROM
  14. Win10下安装Detectron2,超详细教程!
  15. JAVA,Andriod,linux,Php,Mysql,HTML/CSS等学习资源,供大家参考
  16. vuejs中用require引入图片,出现ReferenceError: require is not defined
  17. C++学习(四零零)百度文库页面的核心代码(水印部分)
  18. java 表单设计器 开源_6款在线表单设计器_Web表单设计器_AnyReport
  19. 如何运行vue项目(详细步骤)
  20. 前端js手写日历相关函数(附demo)

热门文章

  1. 每天一道LeetCode-----存在一个由加油站组成的环路,判断是否可以从某个加油站出发环绕一周
  2. qt带小数点的数字串显示,Qt-自定义小数点和千位分隔符
  3. HDU Problem - 1969 Pie(二分,精度)
  4. POJ 3259 Wormholes
  5. nginx工作进程处理请求的系统调用
  6. C 库函数 - atoi()
  7. taylor+swift纽约公寓_豪宅控!Taylor Swift究竟有多喜欢买豪宅!
  8. HTML5_1 笔记
  9. 计算机课组会议讲话,在计算机部教师会议上的讲话
  10. 永磁同步电机三相等效电路图_基于MTPA的永磁同步电动机矢量控制系统分解