题目链接:http://codeforces.com/problemset/problem/631/D

给定两个压缩形式的字符串,如a3b5a4k7这样的形式

问A在B中出现次数。

分类讨论,如果A是只有一种字符的,则答案数量可能很大,但计算也很简单,直接看B的每一个字符,答案累加上cnt2-cnt1+1

如果A不是单字符的,则答案至多是B的压缩之后长度的数量级。

不考虑A的第一个字符,用KMP或者Z函数来计算A的出现情况,如果匹配长度为lenA-1,则检查是否该匹配的第一个字符与A【0】相等且数量大于A【0】的数量,如果匹配长度为lenA-2,则检查是否下一个字符与A最后一个字符是相等的,且数量大于A【lenA-1】的数量。

写的时候需要仔细,因为涉及到不少下标以及条件判断。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctime>
#include <numeric>
#include <cassert> using namespace std; const int N=1e6+; struct Char {
char ch;
long long cnt;
bool operator == (const Char &o) const {
return ch==o.ch&&cnt==o.cnt;
}
};
int z[N];
Char f[N];
void Z(int n) {
z[]=n;
int L=,R=;
for (int i=;i<n;i++) {
if (i>R) {
L=i,R=i;
while (R<n&&f[R-i]==f[R]) R++;
z[i]=R-L;
R--;
}
else {
int k=i-L;
if (z[k]<R-i+)
z[i]=z[k];
else {
L=i;
while (R<n&&f[R-i]==f[R]) R++;
z[i]=R-L;
R--;
}
}
}
}
Char s[N],t[N]; int main() {
int n,m;
scanf("%d %d",&n,&m);
char buf[];
for (int i=;i<n;i++) {
long long cnt;
scanf("%I64d-%s",&cnt,buf);
t[i].cnt=cnt;
t[i].ch=buf[];
}
int k=;
for (int i=;i<n;i++) {
if (t[i].ch==t[i-].ch)
t[k-].cnt+=t[i].cnt;
else {
t[k++]=t[i];
}
}
n=k;
for (int i=;i<m;i++) {
long long cnt;
scanf("%I64d-%s",&cnt,buf);
s[i].cnt=cnt;
s[i].ch=buf[];
}
k=;
for (int i=;i<m;i++) {
if (s[i].ch==s[i-].ch)
s[k-].cnt+=s[i].cnt;
else {
s[k++]=s[i];
}
}
m=k; if (m==) {
long long ret=;
for (int i=;i<n;i++) {
if (t[i].ch==s[].ch&&t[i].cnt>=s[].cnt) {
ret+=t[i].cnt-s[].cnt+;
}
}
printf("%I64d\n",ret);
return ;
}
int len=;
for (int i=;i<m;i++) {
f[len++]=s[i];
}
f[len].ch='#';
f[len].cnt=;
len++;
int from=len;
for (int i=;i<n;i++) {
f[len++]=t[i];
}
Z(len);
int ret=;
for (int i=from+;i<len;i++) {
int lcp=z[i];
if (t[i-from-].ch==s[].ch&&t[i-from-].cnt>=s[].cnt) {
if (lcp==m-)
ret++;
else if (lcp==m-) {
if (s[m-].ch==t[i-from+lcp].ch&&s[m-].cnt<=t[i-from+lcp].cnt)
ret++;
}
}
}
printf("%d\n",ret);
return ;
}

CF #344 D. Messenger KMP/Z的更多相关文章

  1. luogu P5410 模板 扩展 KMP Z函数 模板

    LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...

  2. CF 1288 E. Messenger Simulator

    CF 1288 E. Messenger Simulator 题目传送门 官方题解 题意想必大家都明白了这里就不赘述了,这里只想重点记录一下几种实现方法 分析 设向前移动的序列为\(a\)序列 对于没 ...

  3. Codeforces Round #344 (Div. 2) D. Messenger kmp

    D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ...

  4. CF #93 div1 B. Password KMP/Z

    题目链接:http://codeforces.com/problemset/problem/126/B 大意:给一个字符串,问最长的既是前缀又是后缀又是中缀(这里指在内部出现)的子串. 我自己的做法是 ...

  5. KMP&Z函数详解

    KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...

  6. codeforces 631D. Messenger kmp

    题目链接 首先想到kmp, 和普通的不一样的是,中间部分严格相等, 头和尾的字符相等但是数量可以不相等. 所以应该把子串的头和尾先去掉,然后对剩下的部分进行kmp. 子串长度为1或2要特别讨论. 不要 ...

  7. 再探 KMP 算法

    $\DeclareMathOperator{\fail}{fail}$ KMP 算法堪称经典中的经典,然而这么多年以来,我却未能完全理解这个算法.我对 KMP 算法掌握的程度,是知其原理,但写不出来. ...

  8. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

  9. 关于如何使用sourcetree将本地项目提交到远端github总结?

    使用sourcetree将本地项目提交到github里,目前来说还是很流行的,我也是听说好玩,所以来琢磨了一下,从环境搭建到配置好,差不多用了一下午加一晚上的时间,有点虐心,好吧,废话不多说,介绍一下 ...

随机推荐

  1. Linux部署与基本指令

    把以前写的linux发布一下下吧,写的真的好差劲... Linux部署   chmod:改变一个文件的权限 改变abc的权限为777 常用的权限: 777-644-755 ************** ...

  2. 使用es6特性封装async-mysql

    node.js的mysql模块本身没有提供返回promise的函数,即是说都是用的回调函数,那么对于我们使用async函数是很不方便的一件事.node.js有一个mysql封装库叫mysql-prom ...

  3. 算法模板——sap网络最大流 3(递归+邻接矩阵)

    实现功能:同之前 可以看见的是这次的程序优美了许多,代码简短了一倍还多,可是速度却是和原来的邻接表一个级别的(在Codevs上面草地排水那题的运行时间比较,但是显然数据很大时应该比那个慢些),原理差不 ...

  4. postman定义公共函数

    对于postman定义公共函数,相信很多小伙伴并不是很了解,下面给大家带来了一点福利,一起来看看吧.1.判断是否超时(assertNotTimeout)

  5. MCMC(一)蒙特卡罗方法

    MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链(待填坑) MCMC(三)M-H采样和Gibbs采样(待填坑) 作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Ca ...

  6. webpack引入handlebars报错'You must pass a string or Handlebars AST to Handlebars.compile'

    背景: webpack作为一个部分替代打包工具和模块化工具的优秀选择出现,作为尝试,也为了构建自己习惯的前端开发方式,我尝试了将webpack和自己常用handlebars模板引擎结合.整体项目背景为 ...

  7. React中使用CSSTransitionGroup插件实现轮播图

    动画效果,是一个页面上必不可少的功能,学习一个新的东西,当然就要学习,如何用新的东西,用它的方法去实现以前的东西啦.今天呢,我就在这里介绍一个试用react-addons-css-transition ...

  8. Java核心编程快速学习

    Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...

  9. 自动化监控利器-Zabbix深入配置和使用

    1.  配置流程 Zabbix完整的监控配置流程可以简单描述为: Host groups(主机组)→Hosts(主机)→Applications(监控项组)→Items(监控项)→Triggers(触 ...

  10. android Instrumentoation 问答

    android Instrumentoation 问答   1.instrumentation是执行application instrumentation代码的基类.当应用程序运行的时候instrum ...