HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7
分析 :
有两种做法,如果会拓展KMP的话可以说这就是一道模板题了,拓展KMP专门就是找最长公共前缀的长度,首先将给出的两个字符串双双反转,用模式串去跟主串跑一遍拓展KMP,得到 extend 数组,然后只要遍历一遍 extend 数组,每一个 extend[i] 表示模式串里面前 extend[i] 个前缀都出现过了,因此贡献应该是 1+2+...+extend[i],是等差数列
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
;
;
int next[maxn], extend[maxn], moL, strL;
char mo[maxn], S[maxn];
LL sum[maxn];
void GetNext()
{
next[] = moL;
int a, p;
, j = -; i < moL; i++, j--){
|| i + next[i - a] >= p){
) p = i, j = ;
while (p < moL && mo[p] == mo[j]) p++, j++;
next[i] = j;
a = i;
} else next[i] = next[i - a];
}
}
void GetExtend()
{
GetNext();
int a;
int p;
, j = -; i < strL; i++, j--){
|| i + next[i - a] >= p){
) p = i, j = ;
while (p < strL && j < moL && S[p] == mo[j])
p++, j++;
extend[i] = j;
a = i;
} else extend[i] = next[i - a];
}
}
inline void PrintAns()
{
GetExtend();
LL ans = ;
; i<strL; i++){
if(extend[i]){
LL tmp = extend[i];
tmp = (tmp+)*tmp/;
ans = (ans%mod + tmp%mod)%mod;
}
}
printf("%lld\n", ans);
}
int main()
{
int nCase;
scanf("%d", &nCase);
while(nCase--){
scanf("%s %s", S, mo);
strL = strlen(S);
moL = strlen(mo);
std::reverse(S, S+strL);
std::reverse(mo, mo+moL);
PrintAns();
}
;
}
而KMP做法就是用到了NEXT数组的性质,在解决这题之前or后可以看看这道非常相似的题 ==> 51Nod 1277
只要理解了51Nod 1277的kmp+dp解法,这道题直接效仿即可,关于 51Nod 1277 的题解报告点这里 or 百度
#include<bits/stdc++.h>
using namespace std;
;
;
int Next[maxn], moL, strL;
long long d[maxn];
char mo[maxn], str[maxn];
inline void GetNext()
{
, j = -;
Next[i] = j;
while(i < moL){
&& mo[j]!=mo[i]) j = Next[j];
Next[++i] = ++j;
}
}
inline void Kmp()
{
memset(d, , sizeof(d));
, j = ;
while(i < strL){
&& mo[j]!=str[i]) j = Next[j];
i++, j++, d[j]++;
if(j == moL) j = Next[j];
}
}
inline void PrintAns()
{
GetNext(); Kmp();
;
; i--){
d[Next[i]] += d[i];
sum = (sum + d[i]*i) % mod;
}
printf("%I64d\n", sum);
}
int main(void)
{
int nCase;
scanf("%d", &nCase);
while(nCase--){
scanf("%s %s", str, mo);
moL = strlen(mo);
strL = strlen(str);
std::reverse(str, str+strL);
std::reverse(mo , mo+moL);
PrintAns();
}
;
}
HDU 6153 A Secret ( KMP&&DP || 拓展KMP )的更多相关文章
- hdu-4300(kmp或者拓展kmp)
题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然 ...
- HDU 6153 A Secret(扩展KMP模板题)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
- HDU - 4300 Clairewd’s message (拓展kmp)
HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...
- 【kmp或扩展kmp】HDU 6153 A Secret
acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 1004 HDU 6153 A Secret (字符串处理 KMP)
题目链接 Problem Description Today is the birthday of SF,so VS gives two strings S1,S2 to SF as a presen ...
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...
- HDU 6153 A Secret (KMP)
题意:给定两个串,求其中一个串 s 的每个后缀在另一个串 t 中出现的次数. 析:首先先把两个串进行反转,这样后缀就成了前缀.然后求出 s 的失配函数,然后在 t 上跑一遍,如果发现不匹配了或者是已经 ...
- HDU 6153 A Secret 套路,求解前缀在本串中出现的次数
http://acm.hdu.edu.cn/showproblem.php?pid=6153 首先相当于翻转两个串,然后求s2前缀在s1中出现的次数. 这是一个套路啦 首先把两个串结合起来,中间加一个 ...
随机推荐
- Matlab——矩阵运算 矩阵基本变换操作
矩阵运算 + 加 - 减 .* 乘 ./ 左除 .\ 右除 .^ 次方 .' 转置 除了加减符号,其余的运算符必须加“.” >> a = : a = >> a- %减法 ans ...
- 如何用katalon录制回放一个web UI测试—— katalon学习笔记(四)
,首先打开katanlon,进入到katalon主界面,选择点击file->new->project ,在创建新项目弹出框中Name输入项输入项目的名称:Type选择web,也就是你要测试 ...
- 关于Unity3D中的SerialField这个Attribute的功能
首先我们看看效果,以下是源文件的内容: 然后对应的面板: 要注意的地方其实就这里: 可以看出,public默认就可以在面板中进行修改,相应的设为private的isCreateSoldier却不会出现 ...
- keras recall
# accuracy, fmeasure, precision,recall def mcor(y_true, y_pred): y_pred_pos = K.round(K.clip(y_pred, ...
- nginx rewrite + 排错方法 + server_name 172.19.134.43
upstream space.two.cn { ip_hash; #ip hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题. serve ...
- 学习总结&实验报告1
Java实验报告 1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 实验代码: public class Project ...
- Java8---函数式编程-示例
// Java8函数式编程示例—(Predicate.Stream.Optional) https://blog.csdn.net/weixin_41950473/article/details/84 ...
- css重置的各种版本总结
个人手机端常用到的: @charset "utf-8"; body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ...
- django事务模式
from django.db import transaction from django.db import transaction with transaction.atomic(): obj = ...
- 事件流程以及dom2级事件绑定
事件流程分为三个阶段:捕获阶段.目标阶段.冒泡阶段. 捕获阶段:事件从最顶层元素开始执行,一层层往下,直到精确元素. 目标阶段:事件在精确元素上执行. 冒泡阶段:事件从精确元素开始执行,一层层往上,直 ...