poj 3415 Common Substrings
题目链接:http://poj.org/problem?id=3415
题目分类:后缀数组
题意:给出两个串和一个数字k,求两个串的公共字串大于等于k的数目
代码:
//#include<bits/stdc++.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h> using namespace std; #define N 200005
#define LL long long int wa[N],wb[N],wm[N],wv[N],sa[N];
int *rank,height[N],s[N],a[N];
//sa:字典序中排第i位的起始位置在str中第sa[i]
//rank:就是str第i个位置的后缀是在字典序排第几
//height:字典序排i和i-1的后缀的最长公共前缀 bool cmp(int *r,int a,int b,int l)
{
return r[a] == r[b] && r[a+l] == r[b+l];
} void getsa(int *r,int *sa,int n,int m)
{
int *x=wa,*y=wb,*t;
for(int i=; i<m; ++i)wm[i]=;
for(int i=; i<n; ++i)wm[x[i]=r[i]]++;
for(int i=; i<m; ++i)wm[i]+=wm[i-];
for(int i=n-; i>=; --i)sa[--wm[x[i]]]=i;
for(int i=,j=,p=; p<n; j=j*,m=p)
{
for(p=,i=n-j; i<n; ++i)y[p++]=i;
for(i=; i<n; ++i)if(sa[i]>=j)y[p++]=sa[i]-j;
for(i=; i<m; ++i)wm[i]=;
for(i=; i<n; ++i)wm[x[y[i]]]++;
for(i=; i<m; ++i)wm[i]+=wm[i-];
for(i=n-; i>=; --i)sa[--wm[x[y[i]]]]=y[i];
for(t=x,x=y,y=t,i=p=,x[sa[]]=; i<n; ++i)
{
x[sa[i]]=cmp(y,sa[i],sa[i-],j)?p-:p++;
}
}
rank=x;
} void getheight(int *r,int *sa,int n)
{
for(int i=,j=,k=; i<n; height[rank[i++]]=k)
{
for(k?--k:,j=sa[rank[i]-]; r[i+k] == r[j+k]; ++k);
}
}
int k;
char s1[N];
int len1; LL solve(int n,int len,int k)
{
int *mark=wa,*sta=wb,top=,i;
LL sum=,num[]= {};
for(i = ;i<=n;i++)
{
if(height[i]<k)
{
top = num[] = num[] =;
}
else
{
for(int size = top; size&&sta[size]>height[i]-k+; size--)
{
num[mark[size]] += height[i]-k+-sta[size];
sta[size] = height[i]-k+;
}
sta[++top] = height[i]-k+;
if(sa[i-]<len) mark[top] = ;
if(sa[i-]>len) mark[top] = ;
num[mark[top]]+=height[i]-k+;
if(sa[i]<len) sum+=num[];
if(sa[i]>len) sum+=num[];
}
}
return sum;
} int main()
{
int i,j;
while(~scanf("%d",&k),k)
{
scanf("%s",s1);
int n = ;
for(n = ;s1[n]!='\0';n++)
s[n] = s1[n];
s[len1=n] = '#';
scanf("%s",s1+n+);
n++;
for(;s1[n]!='\0';n++)
s[n] = s1[n];
s[n] = ;
getsa(s,sa,n+,);
getheight(s,sa,n);
printf("%lld\n",solve(n,len1,k));
}
return ;
}
poj 3415 Common Substrings的更多相关文章
- POJ 3415 Common Substrings(后缀数组 + 单调栈)题解
题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(r ...
- poj 3415 Common Substrings(后缀数组+单调栈)
http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Sub ...
- 字符串(后缀数组):POJ 3415 Common Substrings
Common Substrings Description A substring of a string T is defined as: T(i, k)=TiTi+1...Ti+k-1, 1≤ ...
- POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】
传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...
- poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈
题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...
- POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)
http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...
- 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 的结果,也就是当前的后缀与之前 ...
- POJ 3415 Common Substrings ——后缀数组
[题目分析] 判断有多少个长度不小于k的相同子串的数目. N^2显然是可以做到的. 其实可以维护一个关于height的单调栈,统计一下贡献,就可以了. 其实还是挺难写的OTZ. [代码] #inclu ...
随机推荐
- php实现加好友功能
思路: 1用户发送好友申请之后 把申请储存到申请数据表中,状态为 未验证 2 当用户登录时,查询申请表中是否有uid和被申请人id相同的,如果同意,更改状态,并把数据插入到对应的好友数据表否则,删除申 ...
- Flexigrid的编辑功能
editCells:function(){ if(!isEditing){ isEditing = true; $('tbody tr',$(t)).each(function () { for(va ...
- 软件下载网(包括MAC软件大全)
http://www.ddooo.com/ MAC软件大全: http://www.ddooo.com/apple/15_5_1.htm
- RAC 11.2.0.4 安装 遇到 INS-06001
今天安装11.2.0.4的grid软件,在配置passwordless SSH的时候,点击setup 出现此错误 开始网上搜了一把.说什么的都有,什么系统bug啊什么的 但是我另外一套rac却很正常就 ...
- Hough变换在opencv中的应用
霍夫曼变换(Hough Transform)的原理 霍夫曼变换是一种可以检测出某种特殊形状的算法,OpenCV中用霍夫曼变换来检测出图像中的直线.椭圆和其他几何图形.由它改进的算法,可以用来检测任何形 ...
- Swing Dance!摇摆舞!小组
Swing Dance!摇摆舞!小组 Swing Dance!摇摆舞
- HDU 3468 BFS+二分匹配
九野的博客,转载请注明出处 http://blog.csdn.net/acmmmm/article/details/10966383 开始建图打搓了,参考了大牛的题解打的版本比较清爽,后来改的基本雷同 ...
- SwifThumb.com 第一家Swift开发人员论坛 QQ群 343549891
官方QQ群2: 兴许会有app出来让大家随时地学习Swift并在线交流~ watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQW5ld2N6cw==/font ...
- Codeforces Round #270--B. Design Tutorial: Learn from Life
Design Tutorial: Learn from Life time limit per test 1 second memory limit per test 256 megabytes in ...
- winform基础——实现简易赈灾物资发放登记系统
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...