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中出现的次数. 这是一个套路啦 首先把两个串结合起来,中间加一个 ...
随机推荐
- 【MM系列】SAP MM模块-如何修改物料的移动平均价
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-如何修改物料的移动 ...
- SIRIM上海,http://www.sirim-global.com
SIRIM上海 http://www.sirim-global.com
- 深入理解java:2.2. 同步锁Synchronized及其实现原理
同步的基本思想 为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的. 当有第一个线程访问时,就 在锁里保存这个线程的标识 ...
- Spring Task 任务调度(定时器)
1.任务调度SpringTask 1.1什么是任务调度 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的 ...
- 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2 (A-C)
[MtOI2019]黑蚊子多 : 按题意模拟 #include<iostream> #include<cstdio> #include<cstring> using ...
- GeoAdapter实现WMS、WMTS、ArcGIS MapService的区域权限授权管理
背景: 在实际GIS应用中,我们经常会发布GIS地图服务,然后供WebGIS调用.在某些特殊情况下,需要对服务进行区域授权,特定的用户只能够浏览特定范围内的地图数据.通常情况下大家采用的实现方式是使用 ...
- [Nest] 01.初见nest.js
github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...
- webstorm 打开后目录结构不完整
问题: webstorm自动生成的配置文件.idea/modules.xml损坏了,其实是我把这个.idea目录整个删了 解决方法: 1.删除本地目录历史 点击close Project(若是打开多个 ...
- styled-components缺点
缺点 不能用 stylelint 检查你的 Css 代码 在使用 styled-components 的过程中也会遇到一些问题,比如我们的项目会用stylelint来做样式代码的检查,但是使用了 st ...
- Android数据库使用指南(上)
前言Android上的数据库是sqlite,虽然这个数据库是轻量级的,但是储存的东西可不少,sqlite官方表示理论存储容量为140TB,目前应该没有那么大容量的手机,存储能力太强了. 关于如何使用S ...