题目链接: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)的更多相关文章

  1. A - A Secret -扩展KMP

    题目大意: 给你两个字符串A,B,现在要你求B串的后缀在A串中出现的次数和后缀长度的乘积和为多少. 题解: 扩展KMP模板题,将A和B串都逆序以后就变成了求前缀的问题了,扩展KMP求处从i位置开始的最 ...

  2. HDU-6153 A Secret 扩展KMP

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

  3. HDU 6153 A Secret(扩展kmp)

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

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

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

  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. VMware虚拟机看不到共享目录

    1. 确认VMtools已经装好,开启共享文件夹,设置好共享目录 2.执行命令 sudo mount -t vmhgfs .host:/ /mnt/hgfs如果出现错误: Error: cannot ...

  2. poj2115-C Looooops -线性同余方程

    线性同余方程的模板题.和青蛙的约会一样. #include <cstdio> #include <cstring> #define LL long long using nam ...

  3. openfalcon架构及相关服务配置详解

    一:openfalcon组件 1.falcon-agent 数据采集组件 agent内置了一个http接口,会自动采集预先定义的各种采集项,每隔60秒,push到transfer. 2.transfe ...

  4. hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)

    链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...

  5. 【 Gym 101116K 】Mixing Bowls(dfs)

    BUPT2017 wintertraining(15) #4H Gym - 101116K 题意 给定一个菜谱,大写的单词代表混合物,小写的代表基础原料.每个混合物由其它混合物或基础原料组成,不会间接 ...

  6. 洛谷P3085 [USACO13OPEN]阴和阳Yin and Yang(点分治,树上差分)

    洛谷题目传送门 闲话 偶然翻到一道没有题解的淀粉质,想证明一下自己是真的弱 然而ZSYC(字符串组合)早就切了 然后证明成功了,WA到怀疑人生,只好借着ZSY的代码拍,拍了几万组就出来了... 思路 ...

  7. BZOJ 3612: [Heoi2014]平衡

    3612: [Heoi2014]平衡 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 283  Solved: 219[Submit][Status][ ...

  8. 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)

    [BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...

  9. 【转】ls 命令的 20 个实用范例

    Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...

  10. history新增方法

    history对象包含用户访问过的URL,属于window对象的一部分,传统的使用中,它拥有length属性(浏览器历史列表URL数目) 及back().forward().go()方法. 而新的H5 ...