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\)就可以了. 对于相同子串,我们能想 ...
随机推荐
- Karma - MVC Framework for Unity3D
Karma is an MVC framework for Unity3D. Because of how Unity is structured, it actually turns out to ...
- f5 SSL及证书
1.SSL卸载 1)在BIG-IP上终结SSL连接BIG-IP可以全面了解应用,可以使用iRules, Profiles等,可以释放server的资源 2)包含:统一管理证书与密钥:支持基于硬件的关键 ...
- 细说GIT分布式版本控制器
一.Git介绍 Git是目前世界上最先进的分布式版本控制器.Svn CVS 版本控制器:就是用来追溯自己书写的代码的记录信息.好处:可以非常方便的记录何时何地何人操作了哪些代码. 什么是分布式版本控制 ...
- centos更换yum源为aliyun源
国外的yum源由于众所周知的GFW原因,有的被墙,有的很慢,阿里云依靠强大的技术优势建立了国内的开源镜像.阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ 第一步: ...
- 自定义进度条渐变色View
package com.jianke.stepCounter.Activity; import android.annotation.SuppressLint; import android.cont ...
- pthreads v3下的同步处理synchronized
之所以会用到同步,是因为如果多个线程中对同一个资源进行操作时,会发生混乱. 比如2个线程对变量进行加1操作,第1个线程还没来的及改写数据时,第2个线程就对变量进行操作了,那变量最终的结果就是未知的,这 ...
- DevExpress如何实现皮肤的添加及本地化
DevExpress.XtraBars.Helpers.SkinHelper类允许您填充现有RibbonGalleryBarItem或任意菜单(PopupMenu或BarSubItem)项目对应的De ...
- (转)android:inputType参数类型说明
android:inputType参数类型说明 android:inputType="none"--输入普通字符 android:inputType="text" ...
- 主机在无线网络的情况下,设置centos7.2虚拟机网络联通
1.vmvare中,编辑-虚拟网络编辑器 2.虚拟机设置 3.进入linux登录后 输入nmtui 4激活连接 5大功告成,输入ping www.baidu.com 发现ping通了
- Android.Tools.Summary
Android平台上工具的总结 每个工具的详细使用和深入理解参考每个工具相关的blog. 1. Android SDK中提供的工具 http://developer.android.com/tools ...