传送门

常数实在压不下来(蒟蒻开O(3)都过不了)。

但有正确性233.

首先肯定得把两个字符串接在一起。

相当于heightheightheight数组被height&lt;kheight&lt;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(后缀数组+单调栈)的更多相关文章

  1. POJ3415 Common Substrings —— 后缀数组 + 单调栈 公共子串个数

    题目链接:https://vjudge.net/problem/POJ-3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K ...

  2. poj 3415 Common Substrings 后缀数组+单调栈

    题目链接 题意:求解两个字符串长度 大于等于k的所有相同子串对有多少个,子串可以相同,只要位置不同即可:两个字符串的长度不超过1e5; 如 s1 = "xx" 和 s2 = &qu ...

  3. poj 3415 Common Substrings——后缀数组+单调栈

    题目:http://poj.org/problem?id=3415 因为求 LCP 是后缀数组的 ht[ ] 上的一段取 min ,所以考虑算出 ht[ ] 之后枚举每个位置作为右端的贡献. 一开始想 ...

  4. poj 3415 Common Substrings —— 后缀数组+单调栈

    题目:http://poj.org/problem?id=3415 先用后缀数组处理出 ht[i]: 用单调栈维护当前位置 ht[i] 对之前的 ht[j] 取 min 的结果,也就是当前的后缀与之前 ...

  5. POJ3415 Common Substrings(后缀数组 单调栈)

    借用罗穗骞论文中的讲解: 计算A 的所有后缀和B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k 的部分全部加起来.先将两个字符串连起来,中间用一个没有出现过的字符隔开.按height ...

  6. 【BZOJ-3238】差异 后缀数组 + 单调栈

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1561  Solved: 734[Submit][Status] ...

  7. BZOJ_3879_SvT_后缀数组+单调栈

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

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

    BZOJ_3238_[Ahoi2013]差异_后缀数组+单调栈 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao ...

  9. BZOJ.4199.[NOI2015]品酒大会(后缀数组 单调栈)

    BZOJ 洛谷 后缀自动机做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 显然只需要考虑极长的相同子串的贡献,然后求后缀和/后缀\(\max\)就可以了. 对于相同子串,我们能想 ...

随机推荐

  1. 高级测试岗位面试题---MARK

    直接手写一个python类 直接手写一个构造函数 紧接着上面的代码,直接手写,补充完整代码,要求对列表中的人进行排序,并筛选出分数大于80的人的名单,组成一个新的列表显示出来. class Perso ...

  2. attenuation

    attenuation - 必应词典 美[əˌtenjʊ'eɪʃ(ə)n]英[əˌtenjʊ'eɪʃ(ə)n] n.减弱:稀释:[物]衰减:变细 网络衰减量:衰减作用:衰减值

  3. 微信小程序开发——开发者工具中素材管理功能使用的注意事项

    为什么使用“素材管理”: 微信小程序环境中本地资源图片是无法通过 WXSS 获取的,可以使用网络图片,或者 base64,或者使用<image/>标签.. 当然,如果不想这么麻烦,你可能会 ...

  4. Django的CBV的学习

    之前我们在路由匹配的时候,一个url对应一个函数,其实我们还可以一个url对应一个类,这个就是CBV,下面我们来简单的介绍一下CBV 一.CBV的基本用法 1.在路由匹配中要这样写,class_log ...

  5. static 构造函数的认识

    最近,看到一道面试题,如下 class Class1 { ; static Class1() { count++; } public Class1() { count++; } } Class1 on ...

  6. mysql乐观锁总结和实践(二)

    一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占 ...

  7. Fresco加载显示gif图片

    第一步:首先要导包 Android Studio 或者 Gradle dependencies { compile 'com.facebook.fresco:fresco:0.6.0+' } 第二步: ...

  8. js的回调函数详解

    本文主要介绍了个人对于javascript中回调函数的理解和使用方法及示例,需要的朋友可以参考下   现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框 ...

  9. C# mysql 插入数据,中文乱码

    用C#操作mysql时, 插入数据中文都是乱码,只显示问号,数据库本身使用的是utf-8字符. 网上百度一下有两种解决办法: 一种是在执行语句前面设置,如:MySQLCommand mCommand ...

  10. spring读取properties的几种方式

    参考链接:http://www.cnblogs.com/zxf330301/p/6184139.html