博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
阅读量:5172 次
发布时间:2019-06-13

本文共 1076 字,大约阅读时间需要 3 分钟。

【BZOJ4566】[Haoi2016]找相同字符

Description

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

Input

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

Output

输出一个整数表示答案

Sample Input

aabb
bbaa

Sample Output

10

题解:本题跟差异那道题很相似,理论上可以直接一遍sa搞定,但是我比较懒,直接求了3遍sa。

子串相同的方案数=后缀的相同前缀长度总和,两个串的相同后缀长度总和=两个串连一起的总和-两个串内部的长度和

具体做法请见

 

#include 
#include
#include
using namespace std;const int maxn=400010;int n,m,len1,len2;int r[maxn],ra[maxn],rb[maxn],st[maxn],sa[maxn],h[maxn],rank[maxn];int q[maxn],t,ls[maxn],rs[maxn];long long ans,sum;char s1[maxn],s2[maxn];void work(){ int i,j,k,*x=ra,*y=rb,p; for(i=0;i
=0;i--) sa[--st[x[i]]]=i; for(p=j=1;p
<<=1,m=p) { for(p=0,i=n-j;i
=j) y[p++]=sa[i]-j; for(i=0;i
=0;i--) sa[--st[x[y[i]]]]=y[i]; for(swap(x,y),x[sa[0]]=0,i=p=1;i
=h[i]) rs[q[t--]]=i; q[++t]=i; } t=0; for(i=n-1;i>=0;i--) { while(t&&h[q[t]]>h[i]) ls[q[t--]]=i; q[++t]=i; } for(i=1;i

转载于:https://www.cnblogs.com/CQzhangyu/p/6829503.html

你可能感兴趣的文章
数字计数
查看>>
互不侵犯king (状压dp)
查看>>
Java设计模式-Builder生成器模式
查看>>
Delphi中ListView和TreeView的Item中的内存泄露
查看>>
Python内置函数(55)——globals
查看>>
BZOJ4472
查看>>
mysql四-2:多表查询
查看>>
OpenStack之Nova模块
查看>>
C#矩阵求逆
查看>>
LK光流法
查看>>
【面试】求数组子序列的最大和
查看>>
CentOS设置默认启动命令行(不启动图形界面)
查看>>
设计模式-1-单例模式
查看>>
java 读写锁
查看>>
_itoa_s替换 itoa
查看>>
面试问题
查看>>
Jmeter-【JSON Extractor】-响应结果中一级key取值
查看>>
mysql建库
查看>>
bzoj1066: [SCOI2007]蜥蜴
查看>>
jQuery自定义右键菜单
查看>>