hdu6153 扩展kmp求一个字符串的后缀在另一个字符串出现的次数。
- /**
- 题目:hdu6153
- 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153
- 题意:给定两个串,求其中一个串t的每个后缀在另一个串s中出现的次数乘以其长度之和。
- 思路:扩展kmp
- 先将两个字符串翻转过来。那么变成求t串每个前缀在s串出现的次数。
- 直接扩展kmp求出extend[i]表示s串[i,n-1]子串和t串的最长公共前缀。
- 那么s串从i开始和t串前缀有匹配的贡献为1+2+...+extend[i] = extend[i]*(extend[i]+1)/2;
- */
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <set>
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <map>
- using namespace std;
- typedef long long LL;
- #define ms(x,y) memset(x,y,sizeof x)
- typedef pair<int, int> P;
- const int inf = 0x3f3f3f3f;
- const int mod = 1e9 + ;
- const int maxn = 1e6+;
- char s[maxn], t[maxn];
- int Next[maxn], extend[maxn];
- int cnt[maxn];
- LL ans;
- void GetNext(char *T,int* next)
- {
- int a=;
- int Tlen=strlen(T);
- next[]=Tlen;
- while(a<Tlen-&&T[a]==T[a+]) a++;
- next[]=a;
- a=;
- for(int k=;k<Tlen;k++)
- {
- int p=a+next[a]-,L=next[k-a];
- if((k-)+L>=p)
- {
- int j=(p-k+)>? p-k+:;
- while(k+j<Tlen&&T[k+j]==T[j]) j++;
- next[k]=j;
- a=k;
- }
- else next[k]=L;
- }
- }
- void GetExtend(char *S,char *T,int* next,int* extend)
- {
- int a=;
- GetNext(T,next);
- int Slen=strlen(S);
- int Tlen=strlen(T);
- int MinLen=Slen<Tlen? Slen:Tlen;
- while(a<MinLen&&S[a]==T[a]) a++;
- extend[]=a;
- a=;
- for(int k=;k<Slen;k++)
- {
- int p=a+extend[a]-,L=next[k-a];
- if((k-)+L>=p)
- {
- int j=(p-k+)>? p-k+:;
- while(k+j<Slen&&j<Tlen&&S[k+j]==T[j]) j++;
- extend[k]=j;
- a=k;
- }
- else extend[k]=L;
- }
- }
- int main()
- {
- int T;
- cin>>T;
- while(T--)
- {
- scanf("%s%s",s,t);
- ms(cnt,);
- int n = strlen(s);
- int m = strlen(t);
- reverse(s,s+n);
- reverse(t,t+m);
- GetExtend(s,t,Next,extend);
- ans = ;
- for(int i = ; i < n; i++){
- ans = (ans+(LL)extend[i]*(extend[i]+)/)%mod;
- }
- printf("%lld\n",ans);
- }
- return ;
- }
hdu6153 扩展kmp求一个字符串的后缀在另一个字符串出现的次数。的更多相关文章
- HDU 3613 Best Reward(扩展KMP求前后缀回文串)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...
- POJ 2752 (kmp求所有公共前后缀长度)
<题目链接> <转载于> 题目大意: 给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀.从小到大依次输出这些子串的长度.即输出该 ...
- 【kmp+求所有公共前后缀长度】poj 2752 Seek the Name, Seek the Fame
http://poj.org/problem?id=2752 [题意] 给定一个字符串,求这个字符串的所有公共前后缀的长度,按从小到达输出 [思路] 利用kmp的next数组,最后加上这个字符串本身 ...
- HDU-6153 A Secret 扩展KMP
题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和. 题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273 思路:先预处理 ...
- 扩展KMP题目
hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...
- A - A Secret -扩展KMP
题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最 ...
- A - A Secret (扩展kmp)
题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...
- J - Clairewd’s message HDU - 4300(扩展kmp)
题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
随机推荐
- [AngularJS] $scope.$watch
/** * Created by Answer1215 on 11/13/2014. */ function MainCtrl($scope){ function isLongEnough (pwd) ...
- FileAlreadyExistsException: Output directory hdfs://ubuntu:9000/output09 already exists
14/07/21 17:49:59 ERROR security.UserGroupInformation: PriviledgedActionException as:chenlongquan ca ...
- Execute failed: java.io.IOException: Cannot run program "sdk-linux/build-tools/22.0.0/aapt": error=2
在Linux上使用ant编译打包apk的时候,出现以下的错误及解决方法: 1./usr/local/android-sdk-linux/tools/ant/build.xml:698: Execute ...
- alitomcat maven以及Autoconfig
maven概述 Maven的核心是POM(Project Object Model),即项目对象模型.最直观的,maven对项目依赖进行统一的管理,让开发者从纷杂错乱的jar包世界摆脱出来,更加专注于 ...
- <续>调度算法补充
cpmpute->executors: 1.从storm配置获取<compoent-id,parallelism>集合 2.storm-task-info 获得<task-id ...
- 基于canvas的仪表盘效果
概述 基于Canvas实现的仪表盘及效果.通过配置参数,可以任意修改仪表盘颜色,刻度,动画过渡时间等,满足不同场景下的使用.同时使用原生的Canvas,也是学习Canvas的很好的例子. 详细 代码下 ...
- 后台管理-基于 Bootstrap 开发的网站后台管理面板
Bootstrap 开发框架真的很强大,今天推荐几个非常不错的基于 Bootstrap 开发的网站后台管理面板,全部都是响应式布局,细节做得都很不错.可以搜索keenthemes. Metronic ...
- Python 以指定的概率选取元素
Python 以指定的概率选取元素 Problem You want to pick an item at random from a list, just about as random.choic ...
- C#日期格式化英文月份 VS改大小写的快捷键
DateTime.Now.ToString("MMM yyyyy",CultureInfo.CreateSpecificCulture("en-GB")) ; ...
- DataTable转List,转对象
DataTable转List public static List<T> ToListModel<T>(this DataTable table) where T : new( ...