CF #344 D. Messenger KMP/Z
题目链接: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的更多相关文章
- luogu P5410 模板 扩展 KMP Z函数 模板
LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...
- CF 1288 E. Messenger Simulator
CF 1288 E. Messenger Simulator 题目传送门 官方题解 题意想必大家都明白了这里就不赘述了,这里只想重点记录一下几种实现方法 分析 设向前移动的序列为\(a\)序列 对于没 ...
- Codeforces Round #344 (Div. 2) D. Messenger kmp
D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ...
- CF #93 div1 B. Password KMP/Z
题目链接:http://codeforces.com/problemset/problem/126/B 大意:给一个字符串,问最长的既是前缀又是后缀又是中缀(这里指在内部出现)的子串. 我自己的做法是 ...
- KMP&Z函数详解
KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...
- codeforces 631D. Messenger kmp
题目链接 首先想到kmp, 和普通的不一样的是,中间部分严格相等, 头和尾的字符相等但是数量可以不相等. 所以应该把子串的头和尾先去掉,然后对剩下的部分进行kmp. 子串长度为1或2要特别讨论. 不要 ...
- 再探 KMP 算法
$\DeclareMathOperator{\fail}{fail}$ KMP 算法堪称经典中的经典,然而这么多年以来,我却未能完全理解这个算法.我对 KMP 算法掌握的程度,是知其原理,但写不出来. ...
- ACM模板_axiomofchoice
目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...
- 关于如何使用sourcetree将本地项目提交到远端github总结?
使用sourcetree将本地项目提交到github里,目前来说还是很流行的,我也是听说好玩,所以来琢磨了一下,从环境搭建到配置好,差不多用了一下午加一晚上的时间,有点虐心,好吧,废话不多说,介绍一下 ...
随机推荐
- [.net 面向对象程序设计深入](14)Redis——基础
[.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...
- 对spring web启动时IOC源码研究
研究IOC首先创建一个简单的web项目,在web.xml中我们都会加上这么一句 <context-param> <param-name>contextConfigLocatio ...
- 关于Maven的安装及初步使用
关于Maven的初步使用 1. 下载: 进入http://maven.apache.org/download.cgi下载 Maven 3.3.1 2. 将压缩包解压到自己的硬盘中,最好放在某个盘 ...
- protected private public 的区别
1.public,protected,private是Java里用来定义成员的访问权限的,另外还有一种是"default",也就是在成员前不加任何权限修饰符.如: publi ...
- Web 页面测试总结—控件类
web端页面测试,最常见的是基本控件的测试,只有了解常见的控件和其测试方法,才能掌握测试要点,避免漏测情况发生.根据日常工作总结,将控件和常见逻辑集合在一起,总结了几个控件类测试查场景如下. 导航条 ...
- 启动tomcat直接报错:org.apache.tomcat.util.digester.Digester startElement
今天很奇怪,自己手动搭建了一个ssm(spring+springmvc+mybatis)的项目,然后添加到tomcat下,启动直接报错: 2017-3-19 9:24:47 org.apache.to ...
- idea调试SpringMvc, 出现:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener错误的解决办法
有时,使用idea开发SpringMvc发现调试时出现以下错误: 12-Mar-2017 12:08:02.345 严重 [RMI TCP Connection(2)-127.0.0.1] org.a ...
- 百度推出 MIP Shell 链接
在站长将站点 MIP 化时,需要关注 URL 的一共有三个:MIP URL, MIP-Cache URL 以及 MIP-Shell URL. 从 URL 说起 在互联网中,URL 定义页面的地址,每个 ...
- C各个类型的大小
1个字节(byte)是8bit. 我采用的是64位系统,64位指CPU寄存器的数据宽度是64位的. short 和 int:short比int更节省空间,short占内存是Int的一半,当要考虑程序的 ...
- 用C写一个web服务器(二) I/O多路复用之epoll
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...