题目链接: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. node c++多线程插件 第一天 c++线程相关函数

    因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦. 目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件 ...

  2. 关于vue-clidown到本地后,拷贝文件库到另外一台电脑上npm run dev编译报错的处理

    这些天自己在用vue-cli项目,在家里的电脑下下来后写了一些demo,拿到公司继续开发的时候发现删除node_modules文件,运行npm install和npm run 百度,搜狗了好久都没有找 ...

  3. wxpython tab切换页面

    最近没事学习下wxpython,发现很少有关于页面切换的demo,这边分享下2中切换的方法.第一种:利用wx.Notebook第二种:利用Sizer布局实现(自己写的),代码没有涉及到什么重构之类的优 ...

  4. conky 1.10以后的新配置格式

    包装 config conky.config = { ... } 包装 TEXT conky.text = [[ ... ]] 每个 config 选项的变量和取值之间插入 "=" ...

  5. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  6. 3-14 JS基础知识01

    JavaScript的组成: JS特点:JS是一门 脚本语言:不需要编译编译:把代码转化成计算机所认知的二进制语言.JS是一门弱类型语言:声明变量都用varJS是一种动态语言:认知当前的着这个变量到底 ...

  7. yii2.0使用之缓存

    1.片段缓存(针对于视图中的某部分进行缓存): <?php 设置有效时间 $time=15; 缓存依赖,存入文件.当文件内容发生改变是才会刷新新内容 $dependecy=[ 'class'=& ...

  8. git submodule 使用过程中遇到的问题

    git submodule 使用过程中遇到的问题 资源文件 原.gitmodules文件的内容如下: [submodule "Submodules/FFmpegWrapper"] ...

  9. Angular2之管道学习笔记

    管道.可以把一个输出流与另一个输入流连接起来.类似 linux.gulp都有应用. 在Angular2中使用管道非常方便.Angular2中本身提供了一些内置管道.当然也可以自定义管道. 文档链接:h ...

  10. iOS开发之iOS程序的启动过程

    程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delega ...