题面

BZOJ

题解

后缀数组的做法,应该不是很难想
首先看到两个不同的串,当然是接在一起求 SA,height SA,height
那么,考虑一下暴力
在两个串各枚举一个后缀,他们的 lcp lcp就是对答案产生的贡献

现在优化一下,按照 SA SA的顺序枚举来处理 lcp lcp
利用一个单调栈维护一下,每次记录一下前面有多少个的贡献和当前答案一样就好啦
只是有点难写。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 440000
#define ll long long
int n,gr[MAX];
int SA[MAX],hg[MAX],rk[MAX];
int a[MAX],t[MAX],x[MAX],y[MAX];
bool cmp(int i,int j,int k){return y[i]==y[j]&&y[i+k]==y[j+k];}
void GetSA()
{int m=50;for(int i=1;i<=n;++i)t[x[i]=a[i]]++;for(int i=1;i<=m;++i)t[i]+=t[i-1];for(int i=n;i>=1;--i)SA[t[x[i]]--]=i;for(int k=1;k<=n;k<<=1){int p=0;for(int i=1;i<=n;++i)y[i]=0;for(int i=n-k+1;i<=n;++i)y[++p]=i;for(int i=1;i<=n;++i)if(SA[i]>k)y[++p]=SA[i]-k;for(int i=0;i<=m;++i)t[i]=0;for(int i=1;i<=n;++i)t[x[y[i]]]++;for(int i=1;i<=m;++i)t[i]+=t[i-1];for(int i=n;i>=1;--i)SA[t[x[y[i]]]--]=y[i];swap(x,y);x[SA[1]]=p=1;for(int i=2;i<=n;++i)x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;if(p>=n)break;m=p;}for(int i=1;i<=n;++i)rk[SA[i]]=i;for(int i=1,j=0;i<=n;++i){if(j)--j;while(a[i+j]==a[SA[rk[i]-1]+j])++j;hg[rk[i]]=j;}
}
int Q1[MAX],top1,S1[MAX];
int Q2[MAX],top2,S2[MAX];
ll ans,sum1,sum2;
char ch[MAX];
int main()
{scanf("%s",ch+1);for(int i=1,l=strlen(ch+1);i<=l;++i)a[++n]=ch[i]-96,gr[n]=1;a[++n]=27;scanf("%s",ch+1);for(int i=1,l=strlen(ch+1);i<=l;++i)a[++n]=ch[i]-96,gr[n]=2;GetSA();for(int i=1,tot=0;i<n;++i){ans+=(gr[SA[i]]==1)?sum2:sum1;ll tmp1=0;while(top1&&Q1[top1]>=hg[i+1]){tmp1+=S1[top1];sum1-=1ll*(Q1[top1]-hg[i+1])*S1[top1];--top1;}++top1;S1[top1]=tmp1;Q1[top1]=hg[i+1];ll tmp2=0;while(top2&&Q2[top2]>=hg[i+1]){tmp2+=S2[top2];sum2-=1ll*(Q2[top2]-hg[i+1])*S2[top2];--top2;}++top2;S2[top2]=tmp2;Q2[top2]=hg[i+1];if(gr[SA[i]]==1)++S1[top1],sum1+=hg[i+1];else ++S2[top2],sum2+=hg[i+1];}printf("%lld\n",ans);return 0;
}

【BZOJ4566】找相同字符(后缀数组)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组

    [BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...

  9. 长字符串匹配(BWT编码、后缀数组、倍增算法、FM索引)

    用 O(m) 时间复杂度找出一个长度为 m 的短字符串在一个长度为 n 的长字符串中的精确匹配(n>>m),限制长短字符串仅由 A.C.G.T 这四种字符组成. 输入:长短字符串 输出:短 ...

最新文章

  1. python not in range1002无标题_17个新手常见Python运行时错误
  2. pycharm中如何调用Anoconda的库
  3. 无服务器–仅仅是构建现代应用程序的一种方法?
  4. 一、express 路由 todos案例
  5. 云图说|四大业务场景带您玩转华为云SAP
  6. 三星Note 10最新渲染图曝光:与之前爆料基本一致
  7. synchronized原理_浅谈synchronized的实现原理
  8. javaEE之--------统计站点在线人数,安全登录等(观察者设计模式)
  9. InnoDB配置文件复习
  10. Excel两列数据比较,相同的保存在另外一列
  11. Extjs4.0 视频教程
  12. 程序猿如何使用清单,高效完成工作
  13. python控制电机_如何用Python控制LEGO Wedo 2.0的电机
  14. 操作系统介绍,为什么使用虚拟机,虚拟机使用原理透彻解释
  15. 电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识
  16. DataTable 列转行
  17. linux下python升级版本
  18. Ubuntu通过deepin-wine安装QQ(2022.7.20可用)
  19. 114页5万字智能交通大数据平台建设方案
  20. GitHub Pages 快速搭建个人主页

热门文章

  1. 下拉框、下拉控件之Select2(含多选)
  2. 监控易金融行业运维解决方案:信创国产化 时不我待
  3. Transformer秒杀CNN,凭什么?
  4. Linux提权工具(linux-exploit-suggester、优)
  5. 人生苦短我学Java-1-Helloword
  6. win10 宽带拨号上网 无法完成clash代理 解决方法
  7. Osmdroid加载第三方地图googlemap、bingmap等
  8. Tensorflow命名空间与计算图可视化
  9. django的CBV
  10. 【面经攒人品】应急中心单位面经考前复习