1. /**
  2. 题目:hdu6153
  3. 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153
  4. 题意:给定两个串,求其中一个串t的每个后缀在另一个串s中出现的次数乘以其长度之和。
  5. 思路:扩展kmp
  6. 先将两个字符串翻转过来。那么变成求t串每个前缀在s串出现的次数。
  7. 直接扩展kmp求出extend[i]表示s串[i,n-1]子串和t串的最长公共前缀。
  8. 那么s串从i开始和t串前缀有匹配的贡献为1+2+...+extend[i] = extend[i]*(extend[i]+1)/2;
  9.  
  10. */
  11. #include <cstdio>
  12. #include <cstring>
  13. #include <algorithm>
  14. #include <set>
  15. #include <iostream>
  16. #include <cmath>
  17. #include <vector>
  18. #include <map>
  19. using namespace std;
  20. typedef long long LL;
  21. #define ms(x,y) memset(x,y,sizeof x)
  22. typedef pair<int, int> P;
  23. const int inf = 0x3f3f3f3f;
  24. const int mod = 1e9 + ;
  25. const int maxn = 1e6+;
  26. char s[maxn], t[maxn];
  27. int Next[maxn], extend[maxn];
  28. int cnt[maxn];
  29. LL ans;
  30. void GetNext(char *T,int* next)
  31. {
  32. int a=;
  33. int Tlen=strlen(T);
  34. next[]=Tlen;
  35. while(a<Tlen-&&T[a]==T[a+]) a++;
  36. next[]=a;
  37. a=;
  38. for(int k=;k<Tlen;k++)
  39. {
  40. int p=a+next[a]-,L=next[k-a];
  41. if((k-)+L>=p)
  42. {
  43. int j=(p-k+)>? p-k+:;
  44. while(k+j<Tlen&&T[k+j]==T[j]) j++;
  45. next[k]=j;
  46. a=k;
  47. }
  48. else next[k]=L;
  49. }
  50. }
  51.  
  52. void GetExtend(char *S,char *T,int* next,int* extend)
  53. {
  54. int a=;
  55. GetNext(T,next);
  56. int Slen=strlen(S);
  57. int Tlen=strlen(T);
  58. int MinLen=Slen<Tlen? Slen:Tlen;
  59. while(a<MinLen&&S[a]==T[a]) a++;
  60. extend[]=a;
  61. a=;
  62. for(int k=;k<Slen;k++)
  63. {
  64. int p=a+extend[a]-,L=next[k-a];
  65. if((k-)+L>=p)
  66. {
  67. int j=(p-k+)>? p-k+:;
  68. while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;
  69. extend[k]=j;
  70. a=k;
  71. }
  72. else extend[k]=L;
  73. }
  74. }
  75. int main()
  76. {
  77. int T;
  78. cin>>T;
  79. while(T--)
  80. {
  81. scanf("%s%s",s,t);
  82. ms(cnt,);
  83. int n = strlen(s);
  84. int m = strlen(t);
  85. reverse(s,s+n);
  86. reverse(t,t+m);
  87. GetExtend(s,t,Next,extend);
  88. ans = ;
  89. for(int i = ; i < n; i++){
  90. ans = (ans+(LL)extend[i]*(extend[i]+)/)%mod;
  91. }
  92. printf("%lld\n",ans);
  93. }
  94. return ;
  95. }

hdu6153 扩展kmp求一个字符串的后缀在另一个字符串出现的次数。的更多相关文章

  1. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  2. POJ 2752 (kmp求所有公共前后缀长度)

    <题目链接> <转载于> 题目大意:  给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀.从小到大依次输出这些子串的长度.即输出该 ...

  3. 【kmp+求所有公共前后缀长度】poj 2752 Seek the Name, Seek the Fame

    http://poj.org/problem?id=2752 [题意] 给定一个字符串,求这个字符串的所有公共前后缀的长度,按从小到达输出 [思路] 利用kmp的next数组,最后加上这个字符串本身 ...

  4. HDU-6153 A Secret 扩展KMP

    题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和. 题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273 思路:先预处理 ...

  5. 扩展KMP题目

    hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...

  6. A - A Secret -扩展KMP

    题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最 ...

  7. A - A Secret (扩展kmp)

    题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...

  8. J - Clairewd’s message HDU - 4300(扩展kmp)

    题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...

  9. HDU 6153 A Secret(扩展kmp)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

随机推荐

  1. [AngularJS] $scope.$watch

    /** * Created by Answer1215 on 11/13/2014. */ function MainCtrl($scope){ function isLongEnough (pwd) ...

  2. FileAlreadyExistsException: Output directory hdfs://ubuntu:9000/output09 already exists

    14/07/21 17:49:59 ERROR security.UserGroupInformation: PriviledgedActionException as:chenlongquan ca ...

  3. Execute failed: java.io.IOException: Cannot run program &quot;sdk-linux/build-tools/22.0.0/aapt&quot;: error=2

    在Linux上使用ant编译打包apk的时候,出现以下的错误及解决方法: 1./usr/local/android-sdk-linux/tools/ant/build.xml:698: Execute ...

  4. alitomcat maven以及Autoconfig

    maven概述 Maven的核心是POM(Project Object Model),即项目对象模型.最直观的,maven对项目依赖进行统一的管理,让开发者从纷杂错乱的jar包世界摆脱出来,更加专注于 ...

  5. <续>调度算法补充

    cpmpute->executors: 1.从storm配置获取<compoent-id,parallelism>集合 2.storm-task-info 获得<task-id ...

  6. 基于canvas的仪表盘效果

    概述 基于Canvas实现的仪表盘及效果.通过配置参数,可以任意修改仪表盘颜色,刻度,动画过渡时间等,满足不同场景下的使用.同时使用原生的Canvas,也是学习Canvas的很好的例子. 详细 代码下 ...

  7. 后台管理-基于 Bootstrap 开发的网站后台管理面板

    Bootstrap 开发框架真的很强大,今天推荐几个非常不错的基于 Bootstrap 开发的网站后台管理面板,全部都是响应式布局,细节做得都很不错.可以搜索keenthemes. Metronic ...

  8. Python 以指定的概率选取元素

    Python 以指定的概率选取元素 Problem You want to pick an item at random from a list, just about as random.choic ...

  9. C#日期格式化英文月份 VS改大小写的快捷键

    DateTime.Now.ToString("MMM yyyyy",CultureInfo.CreateSpecificCulture("en-GB")) ;  ...

  10. DataTable转List,转对象

    DataTable转List public static List<T> ToListModel<T>(this DataTable table) where T : new( ...