HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7
分析 :
有两种做法,如果会拓展KMP的话可以说这就是一道模板题了,拓展KMP专门就是找最长公共前缀的长度,首先将给出的两个字符串双双反转,用模式串去跟主串跑一遍拓展KMP,得到 extend 数组,然后只要遍历一遍 extend 数组,每一个 extend[i] 表示模式串里面前 extend[i] 个前缀都出现过了,因此贡献应该是 1+2+...+extend[i],是等差数列
#include<stdio.h> #include<string.h> #include<algorithm> #define LL long long ; ; int next[maxn], extend[maxn], moL, strL; char mo[maxn], S[maxn]; LL sum[maxn]; void GetNext() { next[] = moL; int a, p; , j = -; i < moL; i++, j--){ || i + next[i - a] >= p){ ) p = i, j = ; while (p < moL && mo[p] == mo[j]) p++, j++; next[i] = j; a = i; } else next[i] = next[i - a]; } } void GetExtend() { GetNext(); int a; int p; , j = -; i < strL; i++, j--){ || i + next[i - a] >= p){ ) p = i, j = ; while (p < strL && j < moL && S[p] == mo[j]) p++, j++; extend[i] = j; a = i; } else extend[i] = next[i - a]; } } inline void PrintAns() { GetExtend(); LL ans = ; ; i<strL; i++){ if(extend[i]){ LL tmp = extend[i]; tmp = (tmp+)*tmp/; ans = (ans%mod + tmp%mod)%mod; } } printf("%lld\n", ans); } int main() { int nCase; scanf("%d", &nCase); while(nCase--){ scanf("%s %s", S, mo); strL = strlen(S); moL = strlen(mo); std::reverse(S, S+strL); std::reverse(mo, mo+moL); PrintAns(); } ; }
而KMP做法就是用到了NEXT数组的性质,在解决这题之前or后可以看看这道非常相似的题 ==> 51Nod 1277
只要理解了51Nod 1277的kmp+dp解法,这道题直接效仿即可,关于 51Nod 1277 的题解报告点这里 or 百度
#include<bits/stdc++.h> using namespace std; ; ; int Next[maxn], moL, strL; long long d[maxn]; char mo[maxn], str[maxn]; inline void GetNext() { , j = -; Next[i] = j; while(i < moL){ && mo[j]!=mo[i]) j = Next[j]; Next[++i] = ++j; } } inline void Kmp() { memset(d, , sizeof(d)); , j = ; while(i < strL){ && mo[j]!=str[i]) j = Next[j]; i++, j++, d[j]++; if(j == moL) j = Next[j]; } } inline void PrintAns() { GetNext(); Kmp(); ; ; i--){ d[Next[i]] += d[i]; sum = (sum + d[i]*i) % mod; } printf("%I64d\n", sum); } int main(void) { int nCase; scanf("%d", &nCase); while(nCase--){ scanf("%s %s", str, mo); moL = strlen(mo); strL = strlen(str); std::reverse(str, str+strL); std::reverse(mo , mo+moL); PrintAns(); } ; }
HDU 6153 A Secret ( KMP&&DP || 拓展KMP )的更多相关文章
- hdu-4300(kmp或者拓展kmp)
题意:乱七八糟说了一大堆,就是先给你一个长度26的字符串,对应了abcd....xyz,这是一个密码表.然后给你一个字符串,这个字符串是不完整的(完整的应该是前半部分是加密的,后半部分是解密了的),然 ...
- HDU 6153 A Secret(扩展KMP模板题)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
- HDU - 4300 Clairewd’s message (拓展kmp)
HDU - 4300 题意:这个题目好难读懂,,先给你一个字母的转换表,然后给你一个字符串密文+明文,密文一定是全的,但明文不一定是全的,求最短的密文和解密后的明文: 题解:由于密文一定是全的,所以他 ...
- 【kmp或扩展kmp】HDU 6153 A Secret
acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...
- 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 ...
- HDU 6153 A Secret(扩展kmp)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- 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 上跑一遍,如果发现不匹配了或者是已经 ...
- HDU 6153 A Secret 套路,求解前缀在本串中出现的次数
http://acm.hdu.edu.cn/showproblem.php?pid=6153 首先相当于翻转两个串,然后求s2前缀在s1中出现的次数. 这是一个套路啦 首先把两个串结合起来,中间加一个 ...
随机推荐
- python2.7安装numpy、pandas、matplotlib库
我装的是python2.7 然后pip的版本是18.1,最近使用pip install **安装包的时候总是会提示 You are using pip version 18.1, however ve ...
- 本机添加DNS映射
开发项目时本地进行代码编写测试,需要与服务器主机进行DNS映射. 本地主机添加DNS映射步骤 一:复制备份hosts文件 找到C:\Windows\System32\drivers\etc下的host ...
- Git 的使用及其一些基本用法
打开你的git-bash 绑定用户和邮箱作为标识 $ git config --global user.name "your name" $ git config --global ...
- 数据契约[DataContract]
数据契约(DataContract)服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型.一旦声明一个类型为DataContract,那么该类型就可以被序列 ...
- sqlplus无法登陆?
关键词:error 6 initialize sqlplus,ORA-27101: shared memory realm does not exist 1.error 6 initialize sq ...
- Windows 下安装 ElasticSearch 修改 elasticsearch.yml的坑
注意: ElasticSerach 集成 IK分词器 的时候,整个路径不能有空格!!! 1. 文件后加入 严格复制粘贴,否则入坑 http.cors.enabled : true http.cors ...
- 0ctf 2017 kernel pwn knote write up
UAF due to using hlist_add_behind() without checking. There is a pair locker(mutex_lock) at delete_n ...
- kotlin学习(7)高阶函数
高阶函数 以另一个函数作为参数或者返回值的函数被称为高阶函数. 函数类型 //隐式声明(省略了变量类型) val sum = (x:Int, y:Int -> x+y) val action = ...
- C/C++ 内存与指针
内存与指针杂谈 1.指针 1.数组指针 int(*ptr)[n] ()的优先级高,(*ptr)表示ptr是一个指针,指向一个int类型的一维数组,这个数组的长度为n,也可以说ptr的步长就是n.也就是 ...
- python并发编程中的多进程(代码实现)
一.multipricessing模块的介绍 python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiproce ...