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里,目前来说还是很流行的,我也是听说好玩,所以来琢磨了一下,从环境搭建到配置好,差不多用了一下午加一晚上的时间,有点虐心,好吧,废话不多说,介绍一下 ...
随机推荐
- 专题:DUILIB Win32 透明效果
Win32 透明效果相关基础知识 Layered Windows 分层窗口.这是Windows2000开始引入的概念,重新定义了窗口的Hit Testing方法,以前都是把窗口按rectangle的方 ...
- 腾讯云数据库团队:MySQL数据库的高可用性分析
作者介绍:易固武,腾讯高级工程师,参与腾讯账号安全建设,腾讯数据仓库(TDW)优化改造,腾讯云数据库等项目,对大规模分布式存储和计算系统有浓厚的兴趣和经历 MySQL数据库是目前开源应用最大的关系型数 ...
- Node.js + React + MongoDB 实现 TodoList 单页应用
之前用 Ant Design 开发了一个项目,因此对 React 的特性有了一定的了解,React 使用封装组件的思想,组件各自维护自己的状态和 UI, 组件之间通过 props 传递数据和方法.当状 ...
- 关于报错:AttributeError: module 'turtle' has no attribute 'setup' 问题
对于我们菜鸟,往往安装软件后,都容易使用默认设置,结果将写的文件保存到了安装目录下. 这样造成了很大得隐患,如果写得文件,名称与安装目录下得系统文件名称重复,就容易出现以上报错. 解决方法:1.将文件 ...
- php错误的处理
错误的分类 通常分3种: 语法错误: 程序运行之前,都要先检查语法.如果语法有错误,就会立即报错,并且不会去执行程序. 运行时错误: 就是在程序语法检查通过后,,开始运行程序并在此过程中遇到的错误.常 ...
- ICC_lab总结——ICC_lab2:设计规划
PS:字丑,禁止转载!!! 首先先写出大概的流程,然后是一些教材的理论知识总结,最后是进行lab2的一些流程概述. 教材的理论知识总结主要是:数字集成电路物理设计学习总结--布图规划和布局 --> ...
- 防火墙之netfailt、iptables详解
[TOC] Iptables入门 # 1.iptables介绍 linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成. netfilter 组件也称为 ...
- [原创]HBase学习笔记(3)- Java程序访问HBase
这里介绍使用java api来访问和操作HBase,例如create.delete.select.update等操作. 1.HBase配置 配置HBase使用的zookeeper集群地址和端口. pr ...
- MyBatis快速入门(一)
一.MyBatis背景介绍 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的 ...
- centos安装python2.7并安装easy_install,pip,ipython
1.安装python 下载python2.7.10 # wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz # tar -z ...