题目链接:http://poj.org/problem?id=3415

题目分类:后缀数组

题意:给出两个串和一个数字k,求两个串的公共字串大于等于k的数目

代码:

  1. //#include<bits/stdc++.h>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<algorithm>
  5. #include<string.h>
  6.  
  7. using namespace std;
  8.  
  9. #define N 200005
  10. #define LL long long
  11.  
  12. int wa[N],wb[N],wm[N],wv[N],sa[N];
  13. int *rank,height[N],s[N],a[N];
  14. //sa:字典序中排第i位的起始位置在str中第sa[i]
  15. //rank:就是str第i个位置的后缀是在字典序排第几
  16. //height:字典序排i和i-1的后缀的最长公共前缀
  17.  
  18. bool cmp(int *r,int a,int b,int l)
  19. {
  20. return r[a] == r[b] && r[a+l] == r[b+l];
  21. }
  22.  
  23. void getsa(int *r,int *sa,int n,int m)
  24. {
  25. int *x=wa,*y=wb,*t;
  26. for(int i=; i<m; ++i)wm[i]=;
  27. for(int i=; i<n; ++i)wm[x[i]=r[i]]++;
  28. for(int i=; i<m; ++i)wm[i]+=wm[i-];
  29. for(int i=n-; i>=; --i)sa[--wm[x[i]]]=i;
  30. for(int i=,j=,p=; p<n; j=j*,m=p)
  31. {
  32. for(p=,i=n-j; i<n; ++i)y[p++]=i;
  33. for(i=; i<n; ++i)if(sa[i]>=j)y[p++]=sa[i]-j;
  34. for(i=; i<m; ++i)wm[i]=;
  35. for(i=; i<n; ++i)wm[x[y[i]]]++;
  36. for(i=; i<m; ++i)wm[i]+=wm[i-];
  37. for(i=n-; i>=; --i)sa[--wm[x[y[i]]]]=y[i];
  38. for(t=x,x=y,y=t,i=p=,x[sa[]]=; i<n; ++i)
  39. {
  40. x[sa[i]]=cmp(y,sa[i],sa[i-],j)?p-:p++;
  41. }
  42. }
  43. rank=x;
  44. }
  45.  
  46. void getheight(int *r,int *sa,int n)
  47. {
  48. for(int i=,j=,k=; i<n; height[rank[i++]]=k)
  49. {
  50. for(k?--k:,j=sa[rank[i]-]; r[i+k] == r[j+k]; ++k);
  51. }
  52. }
  53. int k;
  54. char s1[N];
  55. int len1;
  56.  
  57. LL solve(int n,int len,int k)
  58. {
  59. int *mark=wa,*sta=wb,top=,i;
  60. LL sum=,num[]= {};
  61. for(i = ;i<=n;i++)
  62. {
  63. if(height[i]<k)
  64. {
  65. top = num[] = num[] =;
  66. }
  67. else
  68. {
  69. for(int size = top; size&&sta[size]>height[i]-k+; size--)
  70. {
  71. num[mark[size]] += height[i]-k+-sta[size];
  72. sta[size] = height[i]-k+;
  73. }
  74. sta[++top] = height[i]-k+;
  75. if(sa[i-]<len) mark[top] = ;
  76. if(sa[i-]>len) mark[top] = ;
  77. num[mark[top]]+=height[i]-k+;
  78. if(sa[i]<len) sum+=num[];
  79. if(sa[i]>len) sum+=num[];
  80. }
  81. }
  82. return sum;
  83. }
  84.  
  85. int main()
  86. {
  87. int i,j;
  88. while(~scanf("%d",&k),k)
  89. {
  90. scanf("%s",s1);
  91. int n = ;
  92. for(n = ;s1[n]!='\0';n++)
  93. s[n] = s1[n];
  94. s[len1=n] = '#';
  95. scanf("%s",s1+n+);
  96. n++;
  97. for(;s1[n]!='\0';n++)
  98. s[n] = s1[n];
  99. s[n] = ;
  100. getsa(s,sa,n+,);
  101. getheight(s,sa,n);
  102. printf("%lld\n",solve(n,len1,k));
  103. }
  104. return ;
  105. }

poj 3415 Common Substrings的更多相关文章

  1. POJ 3415 Common Substrings(后缀数组 + 单调栈)题解

    题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(r ...

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

    http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Sub ...

  3. 字符串(后缀数组):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≤ ...

  4. POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】

    传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...

  5. poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...

  6. POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)

    http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...

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

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

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

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

  9. POJ 3415 Common Substrings ——后缀数组

    [题目分析] 判断有多少个长度不小于k的相同子串的数目. N^2显然是可以做到的. 其实可以维护一个关于height的单调栈,统计一下贡献,就可以了. 其实还是挺难写的OTZ. [代码] #inclu ...

随机推荐

  1. 双击GridView查看详情

    效果如下: protected void gvEquData_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowTy ...

  2. 基于visual Studio2013解决面试题之0907大数乘法

     题目

  3. ICMP:Internet控制报文协议

    ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...

  4. JQuery - MD5加密

    效果: JS代码: 命名为任意名称,一般为:Jquery.md5.js /** * jQuery MD5 hash algorithm function * * <code> * Calc ...

  5. 删除PO

    FUNCTION zrfc_mm002. *"---------------------------------------------------------------------- * ...

  6. Appium 命令行启动配置

    Appium 安装过后,会有图形界面,同样也支持命令行参数的启动和配置 Windws: 在windows 安装配置Appium有三种方式: Node install -g appium .exe文件安 ...

  7. 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)

    本文转载自:阮一峰的博客,http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 张玉彬的博客 h ...

  8. 【图像识别】 图像处理和图像分析(leptonica)leptonica-1.68安装配置 (vs2008)

    Leptonica Leptonica is a pedagogically-oriented open source site containing software that is broadly ...

  9. Sencha app build 出现 missing name after . operator 问题

    此问题是在使用sencha app build命令后出现得 主要是 YUI Compressor压缩的时候,代码中出现了delete, interface之类的keyword导致的. 此时能够在Web ...

  10. 【IOS实例小计】UIImageView

    预备知识: UIImage 是一个专门存储图片数据的对象,默认兼容的图片格式是 PNG,可以通过文件.Quartz image对象或 image Data数据得到一个图片对象. UIImage相关功能 ...