HDU 6153 A Secret 套路,求解前缀在本串中出现的次数
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 套路,求解前缀在本串中出现的次数的更多相关文章
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...
- HDU 6153 A Secret(扩展KMP模板题)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
- 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 ...
- 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 上跑一遍,如果发现不匹配了或者是已经 ...
- 【kmp或扩展kmp】HDU 6153 A Secret
acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...
- HDU 6153 A Secret
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
随机推荐
- Sublime Text2中Evernote 插件的使用
Sublime Text2是个强大的编辑器, 有好多插件供我们使用, 其中有个插件SublimeEvernote, 可以把代码发送到Evernote里. 但是没找见使用说明, 今天看了下Sublime ...
- HDOJ5441(图论中的并查集)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ; ...
- Go语言命令行操作命令详细介绍
转自:http://www.jb51.net/article/56781.htm Go 命令 Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们: 图 Go命令显示详细的信息 ...
- Python模块-sys模块
sys.version 获取Python解释程序的版本信息 >>> sys.version '2.7.12 (default, Dec 4 2017, 14:50:18 ...
- python 基础 字典 增删改查
content = {"name":"wd","pc":{"phone":111111,"age": ...
- JAVA基础知识总结2(语法基础)
关键字:其实就是某种语言赋予了特殊含义的单词. 保留字:暂时还未规定为关键字的单词,保留准备日后要使用的单词. 标识符:开发人员程序中自定义名词,比如类名,变量名,函数名. PS:1.不能使用关键字. ...
- Add lombok to IntelliJ IDEA
Lombok study link: https://www.jianshu.com/p/365ea41b3573 Add below dependency code to pom.xml <d ...
- 在linux系统个人目录下安装新版python
一.下载所需的python版本文件 在linux个人目录下 下载https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz 解压tar.xz ...
- 《精通Spring4.X企业应用开发实战》读后感第五章(基于Java类的配置)
- CodeForces 492E Vanya and Field (思维题)
E. Vanya and Field time limit per test 2 seconds memory limit per test 256 megabytes input standard ...