2018.11.24 poj3415Common Substrings(后缀数组+单调栈)
传送门
常数实在压不下来(蒟蒻开O(3)都过不了)。
但有正确性233.
首先肯定得把两个字符串接在一起。
相当于heightheightheight数组被height<kheight<kheight<k的分成了几段,统计每段的贡献。
考虑段中每个heightheightheight作为最小值出现的次数就行了。
于是我们用单调栈求出每个位置向左右分别能延展到的最远下标然后统计答案就行了。
细节有点多。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ri register int
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m,len,ban,sa[N],sa2[N],ht[N],rk[N],L[N],R[N],stk[N],top=0;
ll ans=0;
char s[N],t[N];
inline void Sort(){
static int cnt[N];
for(ri i=1;i<=m;++i)cnt[i]=0;
for(ri i=1;i<=n;++i)++cnt[rk[i]];
for(ri i=2;i<=m;++i)cnt[i]+=cnt[i-1];
for(ri i=n;i;--i)sa[cnt[rk[sa2[i]]]--]=sa2[i];
}
inline void getsa(){
for(ri i=1;i<=n;++i)rk[i]=(int)s[i],sa2[i]=i;
m=130,Sort();
for(ri w=1,p=0;m^n;w<<=1,p=0){
for(ri i=n-w+1;i<=n;++i)sa2[++p]=i;
for(ri i=1;i<=n;++i)if(sa[i]>w)sa2[++p]=sa[i]-w;
Sort(),swap(rk,sa2),rk[sa[1]]=p=1;
for(ri i=2;i<=n;++i)rk[sa[i]]=(sa2[sa[i]]==sa2[sa[i-1]]&&sa2[sa[i]+w]==sa2[sa[i-1]+w])?p:++p;
m=p;
}
for(ri i=1,j,k=0;i<=n;ht[rk[i++]]=k)for(k?--k:k,j=sa[rk[i]-1];s[i+k]==s[j+k];++k);
}
inline int min(int a,int b){return a<b?a:b;}
inline void calc(int l,int r){
static int ca[N],cb[N];
for(ri i=min(l-1,0);i<=r;++i)L[i]=R[i]=i,ca[i]=cb[i]=0;
for(ri i=l;i<=r;++i)ca[i]=ca[i-1],cb[i]=cb[i-1],sa[i]<=len?++ca[i]:++cb[i];
for(ri i=l+1;i<=r;++i){
while(top&&ht[stk[top]]>ht[i])R[stk[top--]]=i-1;
stk[++top]=i;
}
while(top)R[stk[top--]]=r;
for(ri i=r;i>l;--i){
while(top&&ht[stk[top]]>=ht[i])L[stk[top--]]=i+1;
stk[++top]=i;
}
while(top)L[stk[top--]]=l;
for(ri i=l+1;i<=r;++i)ans+=(ll)(ht[i]-ban+1)*((ll)(ca[R[i]]-ca[i-1])*(cb[i-1]-cb[L[i]-2])+(ll)(cb[R[i]]-cb[i-1])*(ca[i-1]-ca[L[i]-2]));
}
inline void solve(){
for(ri l=1,r;l<=n;l=r+1){
while(ht[l]<ban&&l<=n)++l;
if(l>n)break;
r=l;
while(ht[r+1]>=ban&&r<n)++r;
calc(l-1,r);
}
cout<<ans<<'\n';
}
int main(){
while(scanf("%d",&ban)&&ban){
ans=0,scanf("%s%s",s+1,t+1),n=strlen(s+1),len=strlen(t+1),s[++n]='@';
for(ri i=1;i<=len;++i)s[++n]=t[i];
len=n-len-1,getsa();
solve();
}
return 0;
}
2018.11.24 poj3415Common Substrings(后缀数组+单调栈)的更多相关文章
- POJ3415 Common Substrings —— 后缀数组 + 单调栈 公共子串个数
题目链接:https://vjudge.net/problem/POJ-3415 Common Substrings Time Limit: 5000MS Memory Limit: 65536K ...
- poj 3415 Common Substrings 后缀数组+单调栈
题目链接 题意:求解两个字符串长度 大于等于k的所有相同子串对有多少个,子串可以相同,只要位置不同即可:两个字符串的长度不超过1e5; 如 s1 = "xx" 和 s2 = &qu ...
- poj 3415 Common Substrings——后缀数组+单调栈
题目:http://poj.org/problem?id=3415 因为求 LCP 是后缀数组的 ht[ ] 上的一段取 min ,所以考虑算出 ht[ ] 之后枚举每个位置作为右端的贡献. 一开始想 ...
- poj 3415 Common Substrings —— 后缀数组+单调栈
题目:http://poj.org/problem?id=3415 先用后缀数组处理出 ht[i]: 用单调栈维护当前位置 ht[i] 对之前的 ht[j] 取 min 的结果,也就是当前的后缀与之前 ...
- POJ3415 Common Substrings(后缀数组 单调栈)
借用罗穗骞论文中的讲解: 计算A 的所有后缀和B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k 的部分全部加起来.先将两个字符串连起来,中间用一个没有出现过的字符隔开.按height ...
- 【BZOJ-3238】差异 后缀数组 + 单调栈
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1561 Solved: 734[Submit][Status] ...
- BZOJ_3879_SvT_后缀数组+单调栈
BZOJ_3879_SvT_后缀数组+单调栈 Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个 ...
- BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈
BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...
- BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)
BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...
随机推荐
- js 小结
<script type="text/javascript"> var hotalAddJs = { makeSubmitDataHandler: function ( ...
- PTA 7-8 哈利·波特的考试(floyd)
哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔咒就是简单地将原来的魔咒倒过来念 ...
- Exceptions
[定义] error: external, like out of memory exception: internal, like file not found 父类都是throwable 逻辑有错 ...
- 893. Groups of Special-Equivalent Strings 奇数偶数位上的相同数
[抄题]: You are given an array A of strings. Two strings S and T are special-equivalent if after any n ...
- Repeater控件添加序号列
在项目开发过程中,会经常遇到ASP.NET repeater控件添加序号列,有些新手可能还不会,网上搜集整理了一些,需要的朋友可以参考下 ASP.NET repeater添加序号列的方法 1.< ...
- (转载)Ubuntu下安装Qt
转载自:http://blog.csdn.net/timidsmile/article/details/7716201 Ubuntu下安装Qt 1: sudo apt-get install qt4- ...
- list集合与HashMap的使用
List<Map<String, Object>> arrays= new ArrayList<Map<String, Object>>(); Hash ...
- Canvas绘图 (html5新增特性)
Canvas 使用<canvas>对象,需要设置属性:width,height.指定绘图的区域大小.在canvas标签前后出现的信息将在不支持<canvas>元素的浏览器中显示 ...
- [Robot Framework] 通过SikuliLibrary可以获取到图片,但是点击失效
执行时,可以看到鼠标已经移动到图片上了,但是点击失效,日志也没有报错 后来发现是windows权限的问题. 通过打开Control Panel->System and Security-> ...
- Spring 注解(一)Spring 注解编程模型
Spring 注解(一)Spring 注解编程模型 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 注解系列 ...