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

2017中国大学生程序设计竞赛 - 网络选拔赛

题意:

给出两个字符串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)的更多相关文章

  1. 【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 ...

  2. poj2406 Power Strings(kmp)

    poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...

  3. POJ 2406 Power Strings(KMP)

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  4. LightOJ 1258 Making Huge Palindromes(KMP)

    题意 给定一个字符串 \(S\) ,一次操作可以在这个字符串的右边增加任意一个字符.求操作之后的最短字符串,满足操作结束后的字符串是回文. \(1 \leq |S| \leq 10^6\) 思路 \( ...

  5. codeM编程大赛E题 (暴力+字符串匹配(kmp))

    题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...

  6. 经典串匹配算法(KMP)解析

    一.问题重述 现有字符串S1,求S1中与字符串S2完全匹配的部分,例如: S1 = "ababaababc" S2 = "ababc" 那么得到匹配的结果是5( ...

  7. URAL 1732 Ministry of Truth(KMP)

    Description In whiteblack on blackwhite is written the utterance that has been censored by the Minis ...

  8. Leetcode28--->字符串的匹配(KMP)

    题目: 题目的本质是给定两个字符串str1,str2,求str1中的str2串开始的地方,即字符串的匹配,KMP算法 思路:时间复杂度为O(m + n),空间复杂度为O(n),原串的长度为m,子串的长 ...

  9. 题解0012:剪花布条(KMP)

    信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符串),求花布条中能剪 ...

随机推荐

  1. Android 官方下拉刷新 SwipeRefreshLayout

    0.build.gradle compile 'com.android.support:support-v4:23+' 1.布局文件 <android.support.v4.widget.Swi ...

  2. Java并发与多线程教程(2)

    Java同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) ...

  3. IoC框架介绍

    转载自:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中, ...

  4. Winform界面GridView中XCDataGridViewCheckBoxAllColumn改变触发事件

    1.首先利用CurrentCellDirtyStateChanged事件 监测状态改变后判断是否有未提交的更改,若有则提交 private void CurrentCellDirtyStateChan ...

  5. net core体系-Xamarin-2概要(lignshi)

    通过本套课程的学习,各位学员能够对Xamarin有一个比较清楚的认识,掌握Xamarin常用功能的使用方法,能够比较熟练的使用Xamarin进行App(移动应用)的开发,能够比较轻松.快速地投入项目当 ...

  6. H5的本地存储(localStorage)和cookie比较

    HTML5 的 web Storage 存储方式有两种:localStorage 和 sessionStorage. sessionStorage就像是会话级别的cookie,数据会随着浏览器关闭而清 ...

  7. 6.SpringMVC 配置式开发-处理器

    处理器除了实现Controller 接口外,还可以继承自一些其他的类,来完成一些特殊的功能 1.继承自AbstractController类 若处理器继承自AbstractController类,那么 ...

  8. sql循环-游标、临时表、表变量

    游标 在游标逐行处理过程中,当需要处理的记录数较大,而且游标处理位于数据库事务内时,速度非常慢. -- 声明变量 DECLARE @Id AS Int -- 声明游标 DECLARE C_Id CUR ...

  9. late_initcall 替换 module_init

    今天在调试pwm驱动程序的时候,在__init函数中调用pwm_init后,则以太网不可用.pwm_init放在设备文件的open函数中,则系统正常运行. 这当中的区别就是硬件初始化函数pwm_ini ...

  10. Maven 安装依赖包

    Guide to installing 3rd party JARs Although rarely, but sometimes you will have 3rd party JARs that ...