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. 前端工程师应该知道的yarn知识

    yarn 是在工作中离不开的工具,但在工作中,很多人基本只会使用 yarn install,而且会手动删除 node-modules,或删除 yarn.lock 文件等不规范操作.本文将从一些基础的知 ...

  2. Java门面模式(思维导图)

    图1 门面模式[点击查看图片] 1,实体对象类 package com.cnblogs.mufasa.demo1; //3个子系统,解决问题的实体 public class StoreA { //示意 ...

  3. python numpy 删除array指定位置的元素

    如图:设计一个数组或者tuple,其中的元素是True或False,那么在False位置上的元素就会被删掉 索引的元素还可以是int型的数,这时候就代表,将原来的数组中指定位置的数放在当前的位置,且索 ...

  4. Flutter 35: 图解自定义 View 之 Canvas (二)

    小菜前几天整理了以下 Canvas 的部分方法,今天小菜继续学习 Canvas 第二部分. drawXXX drawShadow 绘制阴影 drawShadow 用于绘制阴影,第一个参数时绘制一个图形 ...

  5. 使用jMeter构造大量并发的随机HTTP请求

    在前一篇文章使用jMeter构造大量并发HTTP请求进行微服务性能测试里,我介绍了如何用jMeter构造并发HTTP请求.但是通过文中介绍的方式构造的并发请求,其请求参数都是硬编码的'Wang'. 有 ...

  6. async/await 处理多个网络请求同步问题

    1.async/await是基于Promise的,是进一步的一种优化,await会等待异步执行完成 getProjectTask(id){ this.axios.get('/api/v1/task/' ...

  7. TLV320AIC3268寄存器读写

    该芯片支持I2C和SPI读写寄存器,本人用的是SPI1接口. 以下是对手册中SPI接口读写寄存器相关内容的翻译(英文版可以看手册的94页~) 在SPI控制模式下,TLV320AIC3268使用SCL_ ...

  8. Django—auth模块

    auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的 ...

  9. c#中,点击一个菜单项后调用exe文件

    using System.Diagnostics; private void 导出数据ToolStripMenuItem_Click(object sender, EventArgs e) { Pro ...

  10. 友善之臂NanoPC T4网络相关设置

    目前(2019年8月)NanoPC T4的桌面系统FriendlyDesktop是基于Ubuntu18.04进行集成的,因此大部分可以参考Ubuntu18.04的配置方法. 1.无线网络配置 可参考官 ...