631D Messenger
题目大意
给你串s和t
但是每个串都被表示为多个二元组(x,y)表示字符x连续出现y次
问t在s中出现了多少次
分析
我们先将s和t每个串中二元组合并
即相邻两个二元组如果字符相等则将它们变为一个
特判掉m=1的情况
其余情况我们发现对于相等位置除了t的开头结尾两个二元组
其余二元组一定与和s的对应位置完全一样
我们把t去掉头尾放在前面
然后将s放在后面
求出它们的z函数
之后对于s的每个位置如果它的z[i]大于等于m-2
且它的两端字符和t两端相等且个数不小于
那么这个位置合法
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
char l[],ls[],lt[];
int c[],cs[],ct[],n,m,z[],ans,N;
inline void get_z(){
int i,j,k,le=,ri=;
z[]=N;
for(i=;i<N;i++){
if(i<=ri)z[i]=min(ri-i+,z[i-le]);
while(z[i]+i<N&&l[z[i]]==l[z[i]+i]&&c[z[i]]==c[z[i]+i])z[i]++;
if(z[i]+i->ri)ri=z[i]+i-,le=i;
}
}
signed main(){
int i,j,k;
scanf("%lld%lld",&n,&m);
for(i=;i<n;i++)scanf("%lld-%c",&cs[i],&ls[i]);
N=;
for(i=;i<n;i++)
if(ls[i]==ls[i-])cs[N]+=cs[i];
else ls[++N]=ls[i],cs[N]=cs[i];
n=N+;
for(i=;i<m;i++)scanf("%lld-%c",&ct[i],<[i]);
N=;
for(i=;i<m;i++)
if(lt[i]==lt[i-])ct[N]+=ct[i];
else lt[++N]=lt[i],ct[N]=ct[i];
m=N+;
if(m==){
for(i=;i<n;i++)
if(ls[i]==lt[]&&cs[i]>=ct[])ans+=cs[i]-ct[]+;
printf("%lld\n",ans);
return ;
}
N=n+m-;
for(i=;i<m-;i++)l[i-]=lt[i],c[i-]=ct[i];
for(i=;i<n;i++)l[m-+i]=ls[i],c[m-+i]=cs[i];
get_z();
for(i=m-;i<N-m+;i++)
if(z[i]>=m-&&l[i-]==lt[]&&l[i+m-]==lt[m-]&&c[i-]>=ct[]&&c[i+m-]>=ct[m-])ans++;
printf("%lld\n",ans);
return ;
}
631D Messenger的更多相关文章
- codeforces 631D. Messenger kmp
题目链接 首先想到kmp, 和普通的不一样的是,中间部分严格相等, 头和尾的字符相等但是数量可以不相等. 所以应该把子串的头和尾先去掉,然后对剩下的部分进行kmp. 子串长度为1或2要特别讨论. 不要 ...
- CodeForces 631D Messenger
$KMP$. $n=1$和$n=2$的时候可以单独计算.$n>2$时,可以拿字符和数字分别做一次匹配,然后扫描一遍判断一下就可以计算出答案了. #pragma comment(linker, & ...
- Codeforces 631D Messenger【KMP】
题意: 给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s. 分析: KMP 这题唯一需要思考的地方就是如何处理字符串块.第一想到是把他们都展开然后进行KMP,可是展开后实在 ...
- CodeForces 631D Messenger —— (kmp的应用)
这题是一个kmp的应用,思路是有,但是代码实现能力太弱,细节考虑不全,敲了很长时间才AC.. 题意:字符串用如下的方法表示,例如aaabbbbcc表示为3-a,4-b,2-c.那么问t串在s串中出现了 ...
- 【18.40%】【codeforces 631D】Messenger
time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standa ...
- android:使用Messenger进行进程间通信(一)
Messenger简介 Messenger和AIDL是实现进程间通信(interprocess communication)的两种方式. 实际上,Messenger的实现其实是对AIDL的封装. Me ...
- Android进程间通讯之messenger
这两天在看binder,无意间在文档看到messenger这么个东西,感觉这个东西还挺有意思的,给大家分享一下. 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都 ...
- android 史上最简单易懂的跨进程通讯(Messenger)!
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
- android:使用Messenger进行进程间通信(二)
//继续完善音乐播放器demo 相关文章: android:使用Messenger进行进程间通信(一):http://www.cnblogs.com/happyhacking/p/5318418.ht ...
随机推荐
- Log4net使用(一)
转自:http://blog.csdn.net/much0726/article/details/3725563 转自:https://q.cnblogs.com/q/52302/ log4net,既 ...
- STL 配接器(adapters)
定义 配接器(adapters):将一个class的接口,转换为另一个class的接口,使得原来不能一起使用相互兼容的classes,可以一起协同工作. 配接器是一种设计模式. STL中提供的各种配接 ...
- PyTorch笔记之 scatter() 函数
scatter() 和 scatter_() 的作用是一样的,只不过 scatter() 不会直接修改原来的 Tensor,而 scatter_() 会 PyTorch 中,一般函数加下划线代表直接在 ...
- 【转载】如何编写ROS的第一个程序hello_world
目录 1.工作空间的创建 2.功能包的创建 3.功能包的源代码编写 4.功能包的编译配置 5.功能包的编译 6.功能包的启动运行 既然ROS已经成功安装好了,大家一定很想亲自动动手编一个通过起手式例程 ...
- [Python3 填坑] 009 深拷贝与浅拷贝
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python3.7 官方文档 2.2 赋值.切片与 copy() 分析 分析 分析 分析 2.3 copy 模块 分析 分析 2.4 小 ...
- Spark-Core RDD的创建
一.RDD创建的3种方式: 1.从集合中创建RDD 2.从外部存储创建RDD 3.从其他RDD转换得到新的RDD 二.从集合中创建RDD 1.使用parallelize函数创建 scala> v ...
- 分布式唯一ID生成器
在应用程序中,经常需要全局唯一的ID作为数据库主键.如何生成全局唯一ID? 首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作.缺点是字符串作 ...
- (一)WebPack4.0 从零开始
一:WebPack基础知识 (1):webpack的定义 webpack官网给出的定义是:webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). ...
- layui在当前页面弹出一个iframe层,并改变这个iframe层里的一些内容
layer.open({ type: 2, title: "专家信息", area: ['100%', '100%'], content: '/ZhuanJiaKu/AddZhua ...
- TensorFlow——CNN卷积神经网络处理Mnist数据集
CNN卷积神经网络处理Mnist数据集 CNN模型结构: 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积 ...