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. 怎样使用FormData对象加工表单数据

    1. 获取表单(form)节点 2. 对FormData实例做相关操作 3. 发起HTTP请求 function sendForm(form) { var formData = new FormDat ...

  2. C#UDP异步通信

    using SetingDemo.LogHelp;using SetingDemo.SingleRowDeclare;using System;using System.Collections.Gen ...

  3. Java实现发邮件功能---网易邮箱

    目录 Java实现发邮件功能 前言 开发环境 代码 效果 结束语 Java实现发邮件功能 前言 电子邮件的应用场景非常广泛,例如新用户加入,即时发送优惠清单.通过邮件找回密码.监听后台程序,出现异常自 ...

  4. 08 redis缓存穿透、缓存雪崩、缓存击穿

    Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解.如果对数据的一致性要求很 ...

  5. XML模块与类的定义

    xml模块 xml介绍: --XML 全称  可扩展标记语言 --<tag></tag>  双标签   标签中间可以加入文本信息 --<tag/>单标签  没有文本 ...

  6. 垃圾分类常见APP

    垃圾分类指南app 上海就要实行垃圾分类了,垃圾分类指南app你需要吗,这里有相关的各种垃圾分类的介绍与上海垃圾分类投放指南,这里是垃圾分类指南手机入口能够让你更好的去完成垃圾分类呢.垃圾分类指 .. ...

  7. CSS 实现居中 + 清除浮动

    一.水平居中 1.行内元素:text-align:center; 2.块级元素:margin:0 auto; 3.绝对定位和移动:absolute + transform 4.绝对定位和负边距:abs ...

  8. CSS设置浮动导致背景颜色设置无效的解决方法

    float浮动会使父元素高度塌陷,父级元素不能被撑开,所以导致背景颜色不能被撑开 解决方法: 对父元素设置高度 对父元素设置 overflow:hidden清除浮动 把父元素也设置为float浮动 结 ...

  9. python 利用pyttsx3文字转语音(转)

    原文链接作者 # -*- coding: utf-8 -*- import pyttsx3 engine = pyttsx3.init() with open("all.txt", ...

  10. SpringCloud之Feign声明式调用原理及配置

    1 什么是Feign Feign是一种声明式.模板化的HTTP客户端(仅在Application Client中使用).声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求. ...