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 ...
随机推荐
- 双击GridView查看详情
效果如下: protected void gvEquData_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowTy ...
- 基于visual Studio2013解决面试题之0907大数乘法
题目
- ICMP:Internet控制报文协议
ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...
- JQuery - MD5加密
效果: JS代码: 命名为任意名称,一般为:Jquery.md5.js /** * jQuery MD5 hash algorithm function * * <code> * Calc ...
- 删除PO
FUNCTION zrfc_mm002. *"---------------------------------------------------------------------- * ...
- Appium 命令行启动配置
Appium 安装过后,会有图形界面,同样也支持命令行参数的启动和配置 Windws: 在windows 安装配置Appium有三种方式: Node install -g appium .exe文件安 ...
- 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)
本文转载自:阮一峰的博客,http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 张玉彬的博客 h ...
- 【图像识别】 图像处理和图像分析(leptonica)leptonica-1.68安装配置 (vs2008)
Leptonica Leptonica is a pedagogically-oriented open source site containing software that is broadly ...
- Sencha app build 出现 missing name after . operator 问题
此问题是在使用sencha app build命令后出现得 主要是 YUI Compressor压缩的时候,代码中出现了delete, interface之类的keyword导致的. 此时能够在Web ...
- 【IOS实例小计】UIImageView
预备知识: UIImage 是一个专门存储图片数据的对象,默认兼容的图片格式是 PNG,可以通过文件.Quartz image对象或 image Data数据得到一个图片对象. UIImage相关功能 ...