A - A Secret (扩展kmp)
题目链接:https://cn.vjudge.net/contest/283743#problem/A
题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠)。
具体思路:首先将s1和s2翻转过来,这样的话就把后缀问题转换成了求前缀的问题。举个例子,s1="abcd",s2="cd",将两个字符串都翻转之后,s1变成了"dcba",s2变成了"dc",然后就按照扩展kmp的方法求出s2的每一个后缀在s1中的出现的位置,样例二,s1="abababab", s2="aba".翻转之后s1="babababa",s2="aba"。然后扩展kmp求出extend数组之后, 0 3 0 3 0 3 0 1,然后3代表的s2的前3个字符是和s1相同的,那么前两个也是相同的,前一个也是相同的,所以打个桶记录前缀和就能表示出所有的满足情况了。
AC代码:
#include<iostream>
#include<stack>
#include<iomanip>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<cstring>
#include<vector>
using namespace std;
# define ll long long
const int mod = 1e9+;
const int maxn = 1e6+;
char str1[maxn];
char str2[maxn];
int nex[maxn],extend[maxn];
ll vis[maxn];
// 注意vis开long long ,否则会爆精度。
// str2是需要匹配的串,str1是被匹配的串。
void getnex(int len)
{
int a=,p=;
nex[]=len;
for(int i=; i<len; i++)
{
if(i>=p||i+nex[i-a]>=p)
{
if(i>=p)
p=i;
while(p<len&&str2[p]==str2[p-i])
p++;
nex[i]=p-i;
a=i;
}
else
nex[i]=nex[i-a];
}
}
void exkmp(int len1,int len2)
{
getnex(len2);
int a=,p=;
for(int i=; i<len1; i++)
{
if(i>=p||i+nex[i-a]>=p)
{
if(i>=p)
p=i;
while(p<len1&&p-i<len2&&str1[p]==str2[p-i])
p++;
extend[i]=p-i;
a=i;
}
else
extend[i]=nex[i-a];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,,sizeof(vis));
scanf("%s",str1);
scanf("%s",str2);
int len1=strlen(str1);
int len2=strlen(str2);
reverse(str1,str1+len1);
reverse(str2,str2+len2);
exkmp(len1,len2);
for(int i=;i<len1;i++){
vis[extend[i]]++;
}
ll ans=len2*vis[len2]%mod;
for(int i=len2;i>=;i--){
vis[i-]+=vis[i];
ans=(ans+vis[i-]*(i-)%mod+mod)%mod;
}
printf("%lld\n",ans);
}
return ;
}
A - A Secret (扩展kmp)的更多相关文章
- A - A Secret -扩展KMP
题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最 ...
- HDU-6153 A Secret 扩展KMP
题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和. 题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273 思路:先预处理 ...
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- HDU 6153 A Secret(扩展KMP模板题)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
- 【kmp或扩展kmp】HDU 6153 A Secret
acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...
- HDU 6153 扩展kmp
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- KMP和扩展KMP
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...
随机推荐
- IT行业——Linux
现在是21世纪,是科学技术大力发展的一个时代,IT行业已经成为现在的一个非常热门的一个行业,许许多多的人都想要往IT方面发展,找IT方面相关的一个工作.因此,现在也出现了很多IT培训机构,比如培训Li ...
- Maven概述(一)
Maven是什么? Apache Maven is a software project management and comprehension tool. Based on the concept ...
- BZOJ1131[POI2008]Sta——树形DP
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- day9-13 linux基础
有道云笔记链接 http://note.youdao.com/noteshare?id=207be3d6bd79e9ff2e30b160bca1fd87
- LOJ #6435. 「PKUSC2018」星际穿越(倍增)
题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...
- 自学huawei之路-AC6005版本升级步骤
返回自学Huawei之路 自学huawei之路-AC6005版本升级步骤 本文主要采用WEB网管界面升级,方便快捷,推荐使用此方法. 一.升级前检查 1.1 原AC/AP设备版本确认 disp ...
- 【BZOJ2671】Calc(莫比乌斯反演)
[BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...
- 【CF809E】Surprise me!(动态规划,虚树,莫比乌斯反演)
[CF809E]Surprise me!(动态规划,虚树,莫比乌斯反演) 题面 洛谷 CodeForces 翻译: 给定一棵\(n\)个节点的树,每个点有一个权值\(a[i]\),保证\(a[i]\) ...
- How to Add Trust Sites into IE before IE10 through Group Policy
Due to IE10 published, I'll conclude the methods that how to add trust sites in to IE of the version ...
- CF438E The Child and Binary Tree(生成函数,NTT)
题目链接:洛谷 CF原网 题目大意:有 $n$ 个互不相同的正整数 $c_i$.问对于每一个 $1\le i\le m$,有多少个不同形态(考虑结构和点权)的二叉树满足每个点权都在 $c$ 中出现过, ...