题目大意:
给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少。
题解:
扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最长公共前缀存于数组。
最后通过将数组的值不为0的进行一个桶计数,倒着进行一下求和就可以了。注意,在这个题目上扩展kmp处理出来的是
ex[ i ]数组是 A串的每个从 i 位置开始的后缀 ,与B串的最长公共前缀长度,那么这样B串在A串上匹配的情况就一目了然了。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int N = 1000005;
int Next[N];
long long ex[N],tong[N]; //即extand[]
char p[N],t[N];
int T;
long long ans;
void pre() // next[i]: 以第i位置开始的子串 与 T的公共前缀
{
int lp=strlen(p);
Next[0]=lp;
int j=0,k=1;
while(j+1<lp && p[j]==p[j+1]) j++;
Next[1]=j;
for(int i=2; i<lp; i++)
{
int P=Next[k]+k-1;
int L=Next[i-k];
if(i+L<P+1) Next[i]=L;
else
{
j=max(0,P-i+1);
while(i+j<lp && p[i+j]==p[j]) j++; // 枚举(p+1,length) 与(p-k+1,length) 区间比较
Next[i]=j;
k=i;
}
}
}
void exkmp()
{
int lp=strlen(p),lt=strlen(t);
pre(); //next数组初始化
int j=0,k=0;
while(j<lt && j<lp && p[j]==t[j]) j++;
ex[0]=j;
for(int i=1; i<lt; i++)
{
int P=ex[k]+k-1;
int L=Next[i-k];
if(i+L<P+1) ex[i]=L;
else
{
j=max(0,P-i+1);
while(i+j<lt && j<lp && t[i+j]==p[j]) j++;
ex[i]=j;
k=i;
}
}
}
int main()
{ scanf("%d",&T);
while(T--)
{
memset(tong,0,sizeof(tong));
scanf("%s%s",&t,&p);
int lt=strlen(t);
int lp=strlen(p);
reverse(p,p+lp);
reverse(t,t+lt);
exkmp();
ans=0;
for(int i=0; i<lt; i++)
tong[ex[i]]++;
for(int i=lp;i;i--)
{
tong[i]=(tong[i]+tong[i+1])%mod;
ans=(ans+tong[i]*i%mod)%mod;
}
printf("%lld\n",ans); }
}

  

A - A Secret -扩展KMP的更多相关文章

  1. HDU-6153 A Secret 扩展KMP

    题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和. 题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273 思路:先预处理 ...

  2. HDU 6153 A Secret(扩展kmp)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  3. HDU 6153 A Secret(扩展KMP模板题)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total ...

  4. A - A Secret (扩展kmp)

    题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...

  5. 【kmp或扩展kmp】HDU 6153 A Secret

    acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...

  6. HDU 6153 扩展kmp

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  7. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  8. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  9. KMP和扩展KMP

    文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...

随机推荐

  1. Arduino—运算符

    赋值运算符: =    +=   -+     *=      /= %=       取余等于 &=    与等于 &=(与等于)对某个变量的值按位进行与运算,例如:G&=x ...

  2. js中的 Date对象 在 IOS 手机中的兼容性问题

    项目中有个时间相关的需求,很自然的用到了 js 中的 new Date() 获取时间,浏览器使用模拟手机模式访问没有问题,但是真机测试时发现,ios系统的手机无法显示时间. 定位问题发现是 new D ...

  3. 使用以太网通信方式刷新AB PLC固件

    本文详细介绍如何使用以太网通信方式刷新AB PLC固件 一.准备工作 1.  AB PLC控制器一台,本文以5069-L330ER为例,将其通电: 2.  5069-L330ER的IP已设置为172. ...

  4. http 状态码大全

    状态码大全 1**(信息类):表示接收到请求并且继续处理    100——客户必须继续发出请求    101——客户要求服务器根据请求转换HTTP协议版本  2**(响应成功):表示动作被成功接收.理 ...

  5. Redis代码——Python篇

    需要安装的库:redis import redis # 连接数据库 r = redis.StrictRedis(host="localhost", port=6379, passw ...

  6. nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别

    nodejs的package.json定义了一个模块,包括其依赖关系的一个简单的JSON文件,该文件可以包含多个不同的指令来告诉Node包管理器如何处理模块. dependencies则表示此模块依赖 ...

  7. c++17 代码你能看懂吗?

    ------------------------------------------------------------------------------ #include <vector&g ...

  8. Python爬虫基础之UrlError

    一.urllib.error python的urllib.error模块主要是应对urllib.request在网络请求过程中出现的异常而定义的异常处理类.主要有URLError和HTTPError两 ...

  9. CodeForces 671C - Ultimate Weirdness of an Array

    题意: 给以一个定义, F(l, r) 的值表示序列 A[1:n]的子序列 A[1....(l-1),(r+1)...n] 之中 任意两个数的最大公约数的最大值. 求 Sum=∑i=1N∑j=1N(F ...

  10. Java线程池(待续)

    线程池是预先创建线程的一种技术..线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间.当请求到来之后,缓冲池给 ...