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 ...
随机推荐
- cocos2d-x游戏开发系列教程-中国象棋06-游戏规则
前情回顾 上一个博文我们提到象棋运动的函数dealWithChess,但是只是说该函数完成了棋子的选择和移动功能 其实在这个函数里,在移动棋子之前,是要对棋子的移动是否合法进行判断的,我们一起来看看如 ...
- UVa 二分图匹配 Biginners
UVa 1045 - The Great Wall Game 最小权匹配 题意:给你一个n*n的棋盘,上面有n个棋子,要求通过移动各个棋子使得棋子在同一行或者同一列或者对角线上,求最小移动次数. 思路 ...
- three.js 源代码凝视(十)Math/Line3.js
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 - 本博客专注于 敏捷开发 ...
- D16Pascal的编译器和IDE
https://github.com/Memnarch/D16Pascal https://github.com/Memnarch/D16IDE https://github.com/Memnarch ...
- 基于visual Studio2013解决面试题之1004最长等差数列
题目
- 基于visual Studio2013解决C语言竞赛题之1015日期计算
题目 解决代码及点评 /* 15. 已知某年不是闰年,给定该年某一天的月份和日期, 求这一天是该年的第几天. */ #include <stdio.h> #incl ...
- Bandwidth内存带宽測试工具
本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/24766015 ----------------- ...
- Codeforces Round #277 (Div. 2) 题解
Codeforces Round #277 (Div. 2) A. Calculating Function time limit per test 1 second memory limit per ...
- canvas 多种形状绘图方法
function canvasUploadImg(image,imageName,imgType,callbackfn){ var img_width = image.width; var img_h ...
- Libgdx实现异步加载网络图片并保存到SD卡或者data/data目录下边
Libgdx实现异步加载网络图片并保存到SD卡或者data/data目录下边,当本地有图片的时候,直接从本地读取图片,如果本地没有图片,将从服务器异步加载图片 package com.example. ...