http://acm.hdu.edu.cn/showproblem.php?pid=6153

首先相当于翻转两个串,然后求s2前缀在s1中出现的次数。

这是一个套路啦

首先把两个串结合起来,中间加一个'%'之类的分割

设dp[i]表示前缀1---i在本串中的出现次数和

那么从后开始dp,所有dp值一开始都是1,表示前缀出现了一次,就是自己本身。

转移,设当前去到第i位,则dp[next[i + 1] - 1] += dp[i]

就是ABACABA这样,已经知道了ABACABA出现了一次,然后前后缀ABA和ABA重复出现,那么dp[3]肯定能够加上dp[7]的,dp[7]包含了dp[7]个"ABA",就这个意思。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = 2e6 + ;
int nextliu[maxn], dp[maxn];
char str[maxn], sub[maxn];
void get_next (char str[], int nextliu[], int lenstr) {
int i = , j = ;
nextliu[] = ;
while (i <= lenstr) {
if (j == || str[i] == str[j]) {
nextliu[++i] = ++j;
} else j = nextliu[j];
}
return ; }
const int MOD = 1e9 + ;
int dp2[maxn];
void work() {
scanf("%s%s", str + , sub + );
int lenstr = strlen(str + ), lensub = strlen(sub + );
reverse(str + , str + + lenstr);
reverse(sub + , sub + + lensub);
int to = lensub + ;
sub[to++] = '$';
for (int i = ; i <= lenstr; ++i) sub[to++] = str[i];
sub[to] = '\0';
to--;
for (int i = ; i <= lensub; ++i) dp[i] = ;
for (int i = lensub + ; i <= to; ++i) dp[i] = ;
get_next(sub, nextliu, to);
for (int i = to; i >= ; --i) {
int t = nextliu[i + ] - ;
dp[t] += dp[i];
dp[t] %= MOD;
}
// printf("%d\n", dp[2] - dp2[2]);
LL ans = ;
for (int i = ; i <= lensub; ++i) {
ans += 1LL * i * dp[i] % MOD;
ans %= MOD;
}
printf("%I64d\n", ans);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}

其实也可以用后缀数组 + dp搞,不过TLE了,应该要用DC3,不去搞了

http://codeforces.com/contest/432/problem/D

http://acm.gdufe.edu.cn/Problem/read/id/1338

HDU 6153 A Secret 套路,求解前缀在本串中出现的次数的更多相关文章

  1. HDU 6153 A Secret(扩展kmp)

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

  2. HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...

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

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

  4. 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 ...

  5. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...

  6. HDU 6153 A Secret (KMP)

    题意:给定两个串,求其中一个串 s 的每个后缀在另一个串 t 中出现的次数. 析:首先先把两个串进行反转,这样后缀就成了前缀.然后求出 s 的失配函数,然后在 t 上跑一遍,如果发现不匹配了或者是已经 ...

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

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

  8. HDU 6153 A Secret

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

  9. HDU 6153 A Secret ( KMP&&DP || 拓展KMP )

    题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...

随机推荐

  1. POJ1379:Run Away

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...

  2. rsync同步文件,排除多个文件/目录

    使用rsync -aP --exclude=upload 只能排除upload文件/目录.如果要排除多个文件/目录,怎么办?  那只能建一个exclude.list,里面填写要排除的目录(一行一个文件 ...

  3. EF中调整字段的顺序

    EF中设计数据库表结构时,在Designer UI中无法调整添加好的字段顺序. 方法: 1.在Solution Explorer中右击XXX.edmx文件, 选择"Open With&quo ...

  4. 添加一个用户并且让用户获得root权限

    1.创建一般用户: 完全参考默认值创建一个用户, 一般账号UID应该是500以后的. 默认会创建用户家目录和账号一模一样的群组名.创建使用账号且给予口令才算完成了用户的创建流程. useradd us ...

  5. JVM体系结构之一:总体介绍

    一.Java的内存区域划分 Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这一节我们就来解析一下Java的内存区域. Java的内存区域主要分为五部分: 程序计数器(PC) ...

  6. SP:目录

    ylbtech-SP:目录 商谱开发框架 1.返回顶部 1. 1.WebUIWeChatUI MobileUI 2.Core-Model-Repository-Security -Service3.D ...

  7. js提交数据时需判断是点击事件还是回车键

    使用回车键实质还是点击事件==回车时将焦点聚居在某个标签上. Html代码: <div id="btlogin" class="btlogin">& ...

  8. js 面向对象代码

    贴上一段同事写的代码,值的纪念 <script type="text/javascript"> //创建箱子类 function Box(option) { var s ...

  9. 学习Web前端的好网站推荐

    说明:将其他技术技术网址也搜藏到下面,与君共同进步 1.Jquery专题 http://kb.cnblogs.com/zt/jquery/ 2.Entity Framwork专题 http://kb. ...

  10. Freemarker01

    1 如何使用freemarker 1.1 导包 freemarker-2.3.19.jar 1.2 创建一个ftl文件作为模板 1.3 创建一个方法来将ftl模板和数据组合起来 2 利用maven实现 ...