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 ...
随机推荐
- 微信打开网址添加在浏览器中打开提示 http://caibaojian.com/weixin-tip.html
原文链接:http://caibaojian.com/weixin-tip.html#t2 使用微信打开网址时,无法在微信内打开常用下载软件,手机APP等.网上流传的各种微信打开下载链接,微信已更新基 ...
- 初学Ajax
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...
- AJPFX关于abstract的总结
抽象类: abstract抽象:不具体,看不明白.抽象类表象体现.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所 ...
- Java8特性之Lambda、方法引用以及Stream流
Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...
- 萌新--关于vue.js入门及环境搭建
十几天闭关修炼,恶补了html跟css以及JavaScript相应的基础知识,恰巧有个群友准备做开源项目,愿意带着我做,但是要求我必须懂vue.js,所以开始恶补vue.js相关的东西. 在淘宝上买了 ...
- 13 Red-black Trees
13 Red-black Trees Red-black trees are one of many search-tree schemes that are "balanced" ...
- 新奇:(nodejs兄弟)用HTML + FLASH +JS 也可以写桌面EXE。
首先看下面这张图片,下面的所有界面都是用html代码实现的. 编程IDE:vb6.0 使用控件:WEBBROWSER 原理:使用olelib 让程序继承:IDocHostUIHandler 和 ICu ...
- 拼图游戏源码-swift版项目源码
作者fanyinan,源码PuzzleProject,公司的项目中需要一个拼图游戏,之前有手动拼图和随机打乱的功能,近期又由于个(xian)人(zhe)爱(dan)好(teng)自己加入了自动拼图功能 ...
- scrapy 请求传参
class MovieSpider(scrapy.Spider): name = 'movie' allowed_domains = ['www.id97.com'] start_urls = ['h ...
- 使用nsight调试caffe
首先你需要下载caffe源码,然后先编译好,注意一定要将Makefile.config里的DEBUG := 1注释掉 可以看到注释掉debug后编译会生成的.build_debug目录,调试过程中需要 ...