HDU6513/CCPC2017--A Secret(KMP)
A Secret
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)
Total Submission(s): 461 Accepted Submission(s): 182
Problem Description
Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,which have a big secret.SF is interested in this secret and ask VS how to get it.There are the things that VS tell:
Suffix(S2,i) = S2[i...len].Ni is the times that Suffix(S2,i) occurs in S1 and Li is the length of Suffix(S2,i).Then the secret is the sum of the product of Ni and Li.
Now SF wants you to help him find the secret.The answer may be very large, so the answer should mod 1000000007.
Input
Input contains multiple cases.
The first line contains an integer T,the number of cases.Then following T cases.
Each test case contains two lines.The first line contains a string S1.The second line contains a string S2.
1<=T<=10.1<=|S1|,|S2|<=1e6.S1 and S2 only consist of lowercase ,uppercase letter.
Output
For each test case,output a single line containing a integer,the answer of test case.
The answer may be very large, so the answer should mod 1e9+7.
Sample Input
2
aaaaa
aa
abababab
aba
Sample Output
13
19 Hint case 2:
Suffix(S2,1) = "aba",
Suffix(S2,2) = "ba",
Suffix(S2,3) = "a".
N1 = 3,
N2 = 3,
N3 = 4.
L1 = 3,
L2 = 2,
L3 = 1.
ans = (3*3+3*2+4*1)%1000000007.
Source
题意:
给出两个字符串S1,S2,求S2的所有后缀在S1中匹配到的次数与其后缀长度的乘积之和
思路:
由于乘上了后缀长度,所以对某个后缀的匹配而言,每个字母对答案的贡献是1
由此,我们可以将字符串反转,然后跑一遍kmp,在kmp的过程中统计有多少匹配,并加上他们的贡献即可
代码:

1 /*
2 * @FileName: D:\代码与算法\2017训练比赛\CCPC网络赛\1004-bt.cpp
3 * @Author: Pic
4 * @Date: 2017-08-19 16:30:09
5 * @Last Modified time: 2017-08-19 20:54:48
6 */
7 #include <bits/stdc++.h>
8 using namespace std;
9 /*
10 * next[]的含义: x[i-next[i]...i-1]=x[0...next[i]-1]
11 * next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)
12 */
13 long long sum=0;
14 const long long mod=1e9+7;
15 const long long MAXN=2e6+30;
16 char x[MAXN],y[MAXN];
17 int nxt[MAXN];
18 void kmp_pre(char x[],int m)
19 {
20 long long i, j;
21 j = nxt[0] = -1;
22 i = 0;
23 while (i < m)
24 {
25 while (-1 != j && x[i] != x[j])j = nxt[j];
26 nxt[++i] = ++j;
27 }
28 }
29 /*
30 * kmpNext[]的意思: next'[i]=next[next[...[next[i]]]] (直到next'[i]<0或者
31 x[next'[i]]!=x[i])
32 * 这样的预处理可以快一些
33 */
34 void KMP_Count( char x[],int m, char y[],int n)
35 { //x是模式串, y是主串
36 long long i, j;
37 kmp_pre(x,m);
38 i = j = 0;
39 while (i < n)
40 {
41 while (-1 != j && y[i] != x[j]) {
42 sum = (sum+((1+j)*j/2)%mod)%mod;
43 j = nxt[j];
44 }
45 i++; j++;
46 //sum=(sum+j)%mod;
47 if (j >= m)
48 {
49 sum = (sum+((1+j)*j/2)%mod)%mod;
50 j = nxt[j];
51 }
52 }
53 while(j>=1){
54 sum = (sum+((1+j)*j/2)%mod)%mod;
55 j=nxt[j];
56 }
57 }
58 int main()
59 {
60 // clock_t startTime,endTime;
61 //startTime = clock();
62 //freopen("data.in","r",stdin);
63 //freopen("out.txt","w",stdout);
64 int t;
65 scanf("%d",&t);
66 while(t--){
67 scanf("%s%s",y,x);
68 int len1=strlen(y);
69 int len2=strlen(x);
70 reverse(x,x+len2);
71 reverse(y,y+len1);
72 sum=0;
73 KMP_Count(x,len2,y,len1);
74 printf("%I64d\n",sum);
75 }
76 //endTime = clock();
77 //cout << "Totle Time : " <<(double)(endTime - startTime)<< "ms" << endl;
78 return 0;
79 }
HDU6513/CCPC2017--A Secret(KMP)的更多相关文章
- 【HDU 6153】A Secret (KMP)
Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a present,whi ...
- poj2406 Power Strings(kmp)
poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...
- POJ 2406 Power Strings(KMP)
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- LightOJ 1258 Making Huge Palindromes(KMP)
题意 给定一个字符串 \(S\) ,一次操作可以在这个字符串的右边增加任意一个字符.求操作之后的最短字符串,满足操作结束后的字符串是回文. \(1 \leq |S| \leq 10^6\) 思路 \( ...
- codeM编程大赛E题 (暴力+字符串匹配(kmp))
题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...
- 经典串匹配算法(KMP)解析
一.问题重述 现有字符串S1,求S1中与字符串S2完全匹配的部分,例如: S1 = "ababaababc" S2 = "ababc" 那么得到匹配的结果是5( ...
- URAL 1732 Ministry of Truth(KMP)
Description In whiteblack on blackwhite is written the utterance that has been censored by the Minis ...
- Leetcode28--->字符串的匹配(KMP)
题目: 题目的本质是给定两个字符串str1,str2,求str1中的str2串开始的地方,即字符串的匹配,KMP算法 思路:时间复杂度为O(m + n),空间复杂度为O(n),原串的长度为m,子串的长 ...
- 题解0012:剪花布条(KMP)
信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符串),求花布条中能剪 ...
随机推荐
- poj 1753高斯
和前面的开关问题差不多,就是要理解一下我们方程等号的右端代表的含义是什么.我们建立的方程是想让对位的位置变或者不变,然后生成增广矩阵的时候要多注意一点. ac代码: #include #include ...
- Skywalking的增强与拦截机制
整理自架构经理(汤哥)的分享 字节增强条件匹配 在 skywalking 中实现很多基于 byte-buddy 的关于链式匹配查询的实现, 代码如下所示: public abstract class ...
- vue项目中导出PDF的两种方式
参考大家导出的方式,基本上是如下两种: 1.使用 html2Canvas + jsPDF 导出PDF, 这种方式什么都好,就是下载的pdf太模糊了.对要求好的pdf这种方式真是不行啊! 2.调用浏览器 ...
- 关于小程序去除view/navigator 点击后默认阴影效果
hover:class :定义容器在被触发时的样式 通常无用,但若不去除则影响用户体验: 为避免被覆盖,约定在wxss底部添加class,比如: <!-- wxml --> <na ...
- BRD——>MRD——>PRD,产品经理三大文档概念详解及前后逻辑
转自:https://blog.csdn.net/neikutaixiao/article/details/40819445 商业需求文档Business Requirement DocumentBR ...
- android默认获取敏感权限
1.通过系统签名获取权限 定制系统中,可以通过源码的签名文件对应用进行签名,在应用的AndroidManifest.xml中配置好参数,如图 <manifest xmlns:android=&q ...
- CHD-5.3.6集群上Flume安装
Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and ...
- 【转】Delphi货币类型转中文大写金额
unit TU2.Helper.Currency; interface ): string; ): string; implementation uses System.SysUtils, Syste ...
- 第一篇.markdown
目录 Day 01 1.markdown的使用感受 2.markdown的基本语法 2.1 标题 2.2 加粗 2.3 斜体 2.4 高亮 2.5 上标 2.6 下标 2.7 代码引用(>式) ...
- 生成ID之雪花算法
package com.shopping.test; /** * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0000 ...