Description

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

Input

两行,两个字符串s1,s2,长度分别为n1,n2。1 <=n1, n2<= 200000,字符串中只有小写字母

Output

输出一个整数表示答案

Sample Input

aabb

bbaa

Sample Output

10

题解

对这两个串建SAM
记录两个right集合right[i][0]和right[i][1],表示第一个串,第二个串在这里的right集合长度
每个点的贡献就是 (tr[i].dep−tr[tr[i].parent].dep)∗right[i][0]∗right[i][1] ( t r [ i ] . d e p − t r [ t r [ i ] . p a r e n t ] . d e p ) ∗ r i g h t [ i ] [ 0 ] ∗ r i g h t [ i ] [ 1 ] (tr[i].dep-tr[tr[i].parent].dep)*right[i][0]*right[i][1]

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
char ch1[210000],ch2[210000],ch[210000];
struct SAM
{int son[30],dep,parent;SAM(){memset(son,0,sizeof(son));}
}tr[810000];int root,cnt,last,siz[810000][2];
void add(int x)
{int np=++cnt,p=last;tr[np].dep=tr[p].dep+1;while(p&&!tr[p].son[x])tr[p].son[x]=np,p=tr[p].parent;if(p==0)tr[np].parent=root;else{int q=tr[p].son[x];if(tr[q].dep==tr[p].dep+1)tr[np].parent=q;else{int nq=++cnt;tr[nq]=tr[q];tr[nq].dep=tr[p].dep+1;tr[q].parent=tr[np].parent=nq;while(p&&tr[p].son[x]==q)tr[p].son[x]=nq,p=tr[p].parent;}}last=np;
}
int Rsort[810000],sa[810000];
int main()
{
//  freopen("a.in","r",stdin);
//  freopen("a.out","w",stdout);root=last=++cnt;scanf("%s",ch+1);int l1=strlen(ch+1);for(int i=1;i<=l1;i++)add(ch[i]-'a'+1),ch1[i]=ch[i];last=root;scanf("%s",ch+1);int l2=strlen(ch+1);for(int i=1;i<=l2;i++)add(ch[i]-'a'+1),ch2[i]=ch[i];for(int i=1;i<=cnt;i++)Rsort[tr[i].dep]++;for(int i=1;i<=l1+l2;i++)Rsort[i]+=Rsort[i-1];for(int i=cnt;i>=1;i--)sa[Rsort[tr[i].dep]--]=i;for(int p=root,i=1;i<=l1;i++){int y=ch1[i]-'a'+1;p=tr[p].son[y];siz[p][0]++;}for(int p=root,i=1;i<=l2;i++){int y=ch2[i]-'a'+1;p=tr[p].son[y];siz[p][1]++;}for(int i=cnt;i>=1;i--)siz[tr[sa[i]].parent][0]+=siz[sa[i]][0],siz[tr[sa[i]].parent][1]+=siz[sa[i]][1];LL ans=0;for(int i=1;i<=cnt;i++)ans+=(LL)(tr[i].dep-tr[tr[i].parent].dep)*siz[i][0]*siz[i][1];printf("%lld\n",ans);return 0;
}

[bzoj4566][SAM]找相同字符相关推荐

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

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

  2. [bzoj4566][HAOI2016]找相同字符

    4566: [Haoi2016]找相同字符 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 113 Solved: 64 [Submit][Status ...

  3. 【bzoj4566】找相同字符 后缀自动机

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4566 [题解] 我们还是先把A串建成SAM,然后让B串在SAM上跑 因为相同子串数=不同长 ...

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

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

  5. [bzoj4566][HAOI2016]找相同字符(后缀数组)

    题目 传送门 题解 这里:把两个串用一个很大的字符连接起来,求一个后缀数组. 考虑怎样暴力的算答案. 在 rank  r a n k rank数组中从前往后枚举起点,对于每个枚举的起点,都暴力的往后扫 ...

  6. [BZOJ4566][HAOI2016]找相同字符 后缀自动机

    题目要求的就是B的每个字串在A中的出现次数之和. 我们考虑先建出A串的SAM,每个点所代表的串的个数就是 |Righti|∗(Maxi−Maxfai) |Right_i|*(Max_i-Max_{fa ...

  7. 【HAOI2016/BZOJ4566】找相同字符 后缀数组+单调栈

    原题走这里 鉴于我实在不是很懂单调栈和单调队列这一系列东西,所以我决定稍微具体讲一下单调栈. 恩,本题实质上就是求两个字符串的公共子串数,其中只要出现位置不同,就算是不同的子串. 处理多个字符串的经典 ...

  8. 【BZOJ4566】找相同字符,后缀数组

    传送门 思路: 偶然翻到的一个题 苦思冥想算法之时-- 旁边不(jing)会(tong)后缀数组的聪爷爷:这不是后缀数组吗? 赶紧来练一下遗忘的后缀数组(然后手打板子又错了,只能回到博客上重新翻一波以 ...

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

    题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求 SA,height SA,height 那么,考虑一下暴力 在两个串各枚举一个后缀,他们的 lcp lcp ...

最新文章

  1. kali-linux 完美解决sublime输入 中文
  2. TensorFlow学习笔记之一(TensorFlow基本介绍)
  3. Tensorflow笔记(一)
  4. mysql数据库关联练习_mysql数据库建立数据表的练习(附代码)
  5. 中国联通与成都携手,合作打造全球领先的大数据平台
  6. 时尚美妆图片,让你饱眼福的唯美壁纸
  7. cisco路由器基本实验之六 CHAP and RIP (Boson NetSim)
  8. 机器学习ai选股_机器学习技术能够有效用于选股吗?(下)
  9. 逆序对算法c语言,归并排序求逆序对的代码(C语言)
  10. namenode双机热备之操作实践
  11. 水星usb无线网卡linux驱动下载,水星USB无线网卡mw150us苹果macOS系统驱动成功
  12. 数字图像处理-基于Matlab水果识别系统(图片识别)
  13. SQLite3之事务机制详解
  14. Windows2008server系统搭建DHCP服务器
  15. 苹果邮箱怎么登录qq邮箱_邮箱格式怎么写 电子邮箱格式怎么写
  16. pythonif嵌套语句题目_python中if嵌套的练习题有哪些?
  17. 基于粒子群优化算法的微型燃气轮机冷热电联供系统优化调度(Matlab代码实现)
  18. 录屏,webm格式转gif的小技巧
  19. 企业快速寄件打单教程
  20. 怎么把raw转换成jpg格式?推荐两个raw转jpg的方法

热门文章

  1. SERV-U 数据库访问 配置 MYSQL
  2. 将faster RCNN从github上下载的frozen模型转换为tflite时候报错
  3. 渝粤教育 试卷代号:3980 202 1年春季学期期末统一考试管理心理学 试题
  4. 缓存雪崩、缓存穿透、缓存击穿
  5. Java环境搭建(windows版、超详细)
  6. VSCode搭建Java环境
  7. Odoo与浪潮合资研发PS Cloud之退货对平均价格估值的影响
  8. 计算机室管理制度英语,计算机室管理制度.doc
  9. pythonxy官网下载_GitHub - holif/codeparkshare: Python初学者(零基础学习Python、Python入门)书籍、视频、资料、社区推荐...
  10. python里map函数_python中map()函数的用法讲解