题目大意

给你串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],&lt[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的更多相关文章

  1. codeforces 631D. Messenger kmp

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

  2. CodeForces 631D Messenger

    $KMP$. $n=1$和$n=2$的时候可以单独计算.$n>2$时,可以拿字符和数字分别做一次匹配,然后扫描一遍判断一下就可以计算出答案了. #pragma comment(linker, & ...

  3. Codeforces 631D Messenger【KMP】

    题意: 给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s. 分析: KMP 这题唯一需要思考的地方就是如何处理字符串块.第一想到是把他们都展开然后进行KMP,可是展开后实在 ...

  4. CodeForces 631D Messenger —— (kmp的应用)

    这题是一个kmp的应用,思路是有,但是代码实现能力太弱,细节考虑不全,敲了很长时间才AC.. 题意:字符串用如下的方法表示,例如aaabbbbcc表示为3-a,4-b,2-c.那么问t串在s串中出现了 ...

  5. 【18.40%】【codeforces 631D】Messenger

    time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standa ...

  6. android:使用Messenger进行进程间通信(一)

    Messenger简介 Messenger和AIDL是实现进程间通信(interprocess communication)的两种方式. 实际上,Messenger的实现其实是对AIDL的封装. Me ...

  7. Android进程间通讯之messenger

    这两天在看binder,无意间在文档看到messenger这么个东西,感觉这个东西还挺有意思的,给大家分享一下. 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都 ...

  8. android 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  9. android:使用Messenger进行进程间通信(二)

    //继续完善音乐播放器demo 相关文章: android:使用Messenger进行进程间通信(一):http://www.cnblogs.com/happyhacking/p/5318418.ht ...

随机推荐

  1. python3爬虫之urllib初探

    urllib主要包含request(请求模块).error(异常处理模块).parse(工具模块).robotparser(识别网站的robots.txt文件,是否允许爬取). request(请求模 ...

  2. python基础-6.1 match search findall group(s) 区别

    import re # match findall经常用 # re.match() #从开头匹配,没有匹配到对象就返回NONE # re.search() #浏览全部字符,匹配第一个符合规则的字符串 ...

  3. java学习day3运算符

    一.算数运算符 1.对于除号“/”,它的整数除和小数除是有区别的:当整数除以整数的时候,会把结果的小数部分舍弃,只保留整数部分,例如: int x=3510; x=x/1000; 输出结果为x=3; ...

  4. [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机&&hash)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 题目大意为求字符串S有多少个子串S[l,r]满足回文串的定义,并且S[l,(l+r)/2]也满足 ...

  5. NameVirtualHost的使用

    如果某个ip:port 上只设置了一个虚拟主机,那么NameVirtualHost ip:port 可以不写,因为从这个ip:port的访问不需要做任何选择:如上例中192.168.1.197只对应于 ...

  6. 入门级,关于下载设置wamp的安装

    将wamp下载下来,分清楚自己电脑是32还是64位,在安装之前,首先确定你电脑里安装了vc++ 的运行库,不然安装wamp后会出现提醒缺少XXX文件,但是注意,在安装vc运行库的时候,请搜索集合包类的 ...

  7. opencv配置经常遇到的错误

    我们在运行一些书上的例子,经常会遇到以下的错误 还有什么Assertion Failed错误.这些错误都是我运行浅墨书上的例子或者博客的例子上面的代码的错误,他自己也提了一下,但是说的不是特别的清楚, ...

  8. 使用控制台搭建vue-cli脚手架

    注意: 1.安装前您需要查看自己是否有node环境  检查:node - v 2.如果没有的话,需要先搭建好才能进行下一步操作 (参考:https://www.cnblogs.com/sylys/p/ ...

  9. ASE Code Search

    重现基线模型 Hamel's model 基线模型原理 如何实现semantic search?在已有数据库的基础上,衡量一个句子和每段代码的相关性再进行排序,选出最优代码片段即可实现一个通用的cod ...

  10. python中的垃圾回收机制及原理

    序言: 来一起看看: 不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的 ...