Codeforces 631D Messenger【KMP】
题意:
给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s。
分析:
KMP
这题唯一需要思考的地方就是如何处理字符串块。第一想到是把他们都展开然后进行KMP,可是展开后实在太长,所以必须按块进行处理,就要把所有相邻的相同的块进行合并成一个大块。
注意模式串开头和结尾处与t中对应的块不需要严格相等,只要字符相同并且t中个数不小于模式串中的个数~~所以只需将模式串去掉开头和结尾进行匹配,最后再判断一下就好啦~
既然要去掉开头结尾,就要保证原模式串s的长度大于2,所以长度为1和2的情况都需要特殊考虑一下~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 200005;
typedef long long ll;
typedef pair<char, ll> pii;
#define fi first
#define se second
pii s[maxn], t[maxn], ms[maxn];
int m, n, mm;
int next[maxn];
void KMP_pre()
{
int j = next[0] = -1;
int i = 0;
while(i < mm){
while(j != -1 && ms[i] != ms[j]) j = next[j];
next[++i] = ++j;
}
}
ll KMP_count()
{
int i = 0, j = 0;
ll ans = 0;
while(i < n){
while(j != -1 && t[i]!= ms[j]) j = next[j];
i++, j++;
if(j >= mm){
if(i < n && t[i - mm - 1].fi == s[0].fi && t[i - mm - 1].se >= s[0].se
&& t[i].fi == s[m - 1].fi && t[i].se >= s[m - 1].se){
ans++;
}
j = next[j];
}
}
return ans;
}
int main (void)
{
int N, M;
scanf("%d%d", &N, &M);
m = n = mm = 0;
ll tl;
char tc;
for(int i = 0; i < N; i++){
scanf("%I64d-%c", &tl, &tc);
if(i == 0){
t[n++] = pii(tc, tl);
}else{
if(tc == t[n - 1].fi)
t[n - 1].se += tl;
else
t[n++] = pii(tc, tl);
}
}
//for(int i = 0; i < n; i++) cout<<t[i].fi<<' '<<t[i].se<<endl;
for(int i = 0; i < M; i++){
scanf("%I64d-%c", &tl, &tc);
if(i == 0){
s[m++] = pii(tc, tl);
}else{
if(tc == s[m - 1].fi)
s[m - 1].se += tl;
else
s[m++] = pii(tc, tl);
}
}
// for(int i = 0; i < m; i++) cout<<s[i].fi<<' '<<s[i].se<<endl;
if(m == 1){
ll ans = 0;
for(int i = 0; i < n; i++){
if(t[i].fi== s[0].fi && t[i].se >= s[0].se)
ans += t[i].se - s[0].se + 1;
}
cout<<ans<<endl;
}else if(m == 2){
ll ans = 0;
for(int i = 0; i < n - 1; i++){
if(t[i].fi == s[0].fi && t[i].se >= s[0].se
&& t[i +1].fi == s[1].fi && t[i + 1].se >= s[1].se)
ans++;
}
cout<<ans<<endl;
}else{
mm = 0;
for(int i = 1; i < m - 1; i++)
ms[mm++] = s[i];
KMP_pre();
printf("%I64d\n",KMP_count());
}
return 0;
}
思考思考思考~相信自己一定可以做出来的~~
吐槽:为啥么越来越觉得D比C 好做呢~
Codeforces 631D Messenger【KMP】的更多相关文章
- CodeForces 631D Messenger —— (kmp的应用)
这题是一个kmp的应用,思路是有,但是代码实现能力太弱,细节考虑不全,敲了很长时间才AC.. 题意:字符串用如下的方法表示,例如aaabbbbcc表示为3-a,4-b,2-c.那么问t串在s串中出现了 ...
- 【KMP】【最小表示法】NCPC 2014 H clock pictures
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...
- 【动态规划】【KMP】HDU 5763 Another Meaning
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...
- HDOJ 2203 亲和串 【KMP】
HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- [CodeForces - 1225C]p-binary 【数论】【二进制】
[CodeForces - 1225C]p-binary [数论][二进制] 标签: 题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory limit 5 ...
- 【KMP】Censoring
[KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...
- 【KMP】OKR-Periods of Words
[KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...
- 【KMP】Radio Transmission
问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...
- 【kmp】似乎在梦中见过的样子
参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...
随机推荐
- AJPFX关于Java NIO的概述总结
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...
- AJPFX总结Socket的低层次Java网络编程
Socket的低层次Java网络编程 1 Socket通讯 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接. ...
- 一个简单的Java代码生成工具—根据数据源自动生成bean、dao、mapper.xml、service、serviceImpl
目录结构 核心思想 通过properties文件获取数据源—>获取数据表的字段名称.字段类型等—>生成相应的bean实体类(po.model).dao接口(基本的增删改查).mapper. ...
- Angular jsonp 同源策略的问题
引用:http://www.cnblogs.com/dengzy/p/5388357.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决 ...
- Android开发中使用代码删除数据库
更多信息参考:Android开发中使用代码删除数据库 在Android开发中,如果用到数据库,就会有一个很麻烦的问题,就是有时候需要删除数据库很麻烦,要打开Android Device Monitor ...
- Red Hat Linux常用命令
1.查看机器型号 [root@local ~]# dmidecode | grep "Product Name" Product Name: VMware Virtual Plat ...
- yii在Windows下安装(通过composer方式)
Composer 安装: (Composer 不是一个包管理器,它仅仅是一个依赖管理工具.它涉及 "packages" 和 "libraries",但它在每个项 ...
- [转]JavaScript线程运行机制
从开始接触js时,我们便知道js是单线程的.单线程,异步,同步,互调,阻塞等.在实际写js的时候,我们都会用到ajax,不管是原生的实现,还是借助jQuery等工具库实现,我们都知道,ajax可以实现 ...
- js几个逻辑运算符的形象概括
“&&”是逻辑与操作符,只有“&&”两边值同时满足(同时为真),整个表达式值才为真. b>a && b<c //“&& ...
- CREATE SEQUENCE - 创建一个新的序列发生器
SYNOPSIS CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalu ...