【BZOJ4566】[Haoi2016]找相同字符

Description

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

Input

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

Output

输出一个整数表示答案

Sample Input

aabb
bbaa

Sample Output

10

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

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

具体做法请见差异

#include <cstdio>
#include <cstring>
#include <iostream>
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<m;i++) st[i]=0;for(i=0;i<n;i++) st[x[i]=r[i]]++;for(i=1;i<m;i++) st[i]+=st[i-1];for(i=n-1;i>=0;i--)  sa[--st[x[i]]]=i;for(p=j=1;p<n;j<<=1,m=p){for(p=0,i=n-j;i<n;i++)   y[p++]=i;for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<m;i++) st[i]=0;for(i=0;i<n;i++) st[x[y[i]]]++;for(i=1;i<m;i++) st[i]+=st[i-1];for(i=n-1;i>=0;i--)  sa[--st[x[y[i]]]]=y[i];for(swap(x,y),x[sa[0]]=0,i=p=1;i<n;i++)x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j])?p-1:p++;}for(i=1;i<n;i++) rank[sa[i]]=i;for(i=k=0;i<n-1;h[rank[i++]]=k)for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);sum=0,t=0,h[0]=h[n]=-1;for(i=1;i<=n;i++){while(t&&h[q[t]]>=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<n;i++) sum+=(long long)(i-ls[i])*(rs[i]-i)*h[i];
}
int main()
{scanf("%s%s",s1,s2);len1=strlen(s1),len2=strlen(s2);int i;for(i=0;i<len1;i++)  r[i]=s1[i]-'a'+2;r[len1]=0,n=len1+1,m=27;work(),ans-=sum;for(i=0;i<len2;i++)  r[i+len1+1]=s2[i]-'a'+2;r[len1+len2+1]=1;n=len1+len2+2,m=28;work(),ans+=sum;for(i=0;i<len2;i++)  r[i]=s2[i]-'a'+2;r[len2]=0,n=len2+1,m=27;work(),ans-=sum;printf("%lld",ans);return 0;
}

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

【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]

    题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...

  8. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  9. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  10. BZOJ3879: SvT【后缀数组+单调栈】

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

最新文章

  1. 中文自然语言处理导论
  2. UVA11248 网络扩容(枚举割边扩充)
  3. 关于ie6下提交上传表单的注意事项
  4. java dao 单元测试_Spring Service、Dao进行Junit单元测试
  5. 两栈共享存储空间算法
  6. 删除替换字符串中第一次出现的字符串
  7. 理解 Delphi 的类(三) - 初识类的属性
  8. SQL SERVER 2000个人版下载
  9. 运动目标检测之光流法(2):金字塔Lucas-Kanade算法
  10. Android Studio 安装记录
  11. 如何保存微信视频号的视频到本地?
  12. RabbitMQ3.10.7高级特性
  13. python 温度 符号_python中温度单位如何转换?
  14. Unity3D游戏开发介绍
  15. __builtin_函数
  16. 2D图像处理:孔洞填充
  17. c语言设计程序实现顺序冒泡_C语言学习 顺序程序设计
  18. 小程序电商商城怎么搭建?
  19. 区别:KL散度,JS散度,Wasserstein距离(EMD)
  20. mysql vb.net odbc_在VB.net中连接MySql的类库_MySQL

热门文章

  1. 使用git上传gitee
  2. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_14maven工程servlet实例之指定web文件夹...
  3. 关于select标签曾经踩过的几个坑!
  4. PLSQL 问题小记
  5. javaScript中的变量作用域的闭包处理
  6. Linux 下配置多机实时同步
  7. 【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
  8. C#检测驱动是否安装的问题
  9. 自己动手用electron+vue开发博客园文章编辑器客户端【一】
  10. RIDE的底部的日志没显示处理