CodeForces 631D Messenger
$KMP$。
$n=1$和$n=2$的时候可以单独计算。$n>2$时,可以拿字符和数字分别做一次匹配,然后扫描一遍判断一下就可以计算出答案了。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<bitset>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*+c-''; c=getchar();}
} const int maxn=;
struct X { LL num; int a; }s[maxn],t[maxn];
int lens,lent,n,m;
char op[];
int nx[maxn],f[maxn],g[maxn];
LL a[maxn],b[maxn]; int len1,len2; void get_next()
{
int j=-,i=; nx[]=-;
while(i<len2)
{
if(j==-||b[i]==b[j]) i++, j++, nx[i]=j;
else j=nx[j];
}
} void kmp(bool x){
get_next();
int i=,j=;
while(i<len1){
if(j==-||a[i]==b[j]) i++ ,j++;
else j=nx[j];
if(j==len2)
{
if(x==) f[i-j+len2]=;
else g[i-j+len2]=;
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",op); int L=strlen(op);
int num=,sign;
for(int j=;j<=L-;j++) num=num*+op[j]-'';
sign=op[L-]-'a'+;
if(lens==||sign!=s[lens-].a) { s[lens].num=num; s[lens].a=sign; lens++; }
else s[lens-].num+=num;
} for(int i=;i<=m;i++)
{
scanf("%s",op); int L=strlen(op);
int num=,sign;
for(int j=;j<=L-;j++) num=num*+op[j]-'';
sign=op[L-]-'a'+;
if(lent==||sign!=t[lent-].a) { t[lent].num=num; t[lent].a=sign; lent++; }
else t[lent-].num+=num;
} if(lent==)
{
LL ans=;
for(int i=;i<lens;i++)
{
if(s[i].a!=t[].a) continue;
if(s[i].num<t[].num) continue;
ans=ans+s[i].num-t[].num+;
}
printf("%lld\n",ans);
}
else if(lent==)
{
LL ans=;
for(int i=;i<lens-;i++)
{
if(s[i].a!=t[].a||s[i+].a!=t[].a) continue;
if(t[].num>s[i].num||t[].num>s[i+].num) continue;
ans++;
}
printf("%lld\n",ans);
}
else
{
for(int i=;i<lens;i++) a[i]=s[i].a;
for(int i=;i<lent;i++) b[i]=t[i].a;
len1=lens,len2=lent; kmp(); memset(a,,sizeof a); memset(b,,sizeof b);
for(int i=;i<lens;i++) a[i]=s[i].num;
for(int i=;i<lent-;i++) b[i-]=t[i].num;
len1=lens; len2=lent-; kmp(); LL ans=;
for(int i=;i<lens;i++)
{
if(f[i+]==) continue;
if(g[i]==) continue;
if(s[i].num<t[lent-].num) continue;
if(s[i-lent+].num<t[].num) continue;
ans++;
}
printf("%lld\n",ans); }
return ;
}
CodeForces 631D Messenger的更多相关文章
- codeforces 631D. Messenger kmp
题目链接 首先想到kmp, 和普通的不一样的是,中间部分严格相等, 头和尾的字符相等但是数量可以不相等. 所以应该把子串的头和尾先去掉,然后对剩下的部分进行kmp. 子串长度为1或2要特别讨论. 不要 ...
- 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 ...
- codeforces 1288E. Messenger Simulator(树状数组)
链接:https://codeforces.com/contest/1288/problem/E 题意:序列p的长度为n,初始序列为1 2 3 4 ...n,然后有m次操作,每次指定序列中一个数移动到 ...
- 631D Messenger
题目大意 给你串s和t 但是每个串都被表示为多个二元组(x,y)表示字符x连续出现y次 问t在s中出现了多少次 分析 我们先将s和t每个串中二元组合并 即相邻两个二元组如果字符相等则将它们变为一个 特 ...
- Codeforces Round #344 (Div. 2) D. Messenger kmp
D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ...
- Codeforces Round #344 (Div. 2) D. Messenger (KMP)
D. Messenger time limit per test2 seconds memory limit per test512 megabytes inputstandard input out ...
- Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator
可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j>=i 的不同数 ...
随机推荐
- 基于EF+MVC+Bootstrap的通用后台管理系统及架构
分享基于EF+MVC+Bootstrap的通用后台管理系统及架构 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了 ...
- JQuery each详细用法
each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...
- Windows下MYSQL自动备份批处理
windows下MYSQL自动备份批处理 2011-05-04 09:16:45| 分类: mysql|举报|字号 订阅 按系统时间进行备份 注意mysql安装路径中如果有空格.就要把,.b ...
- bootstrap + angularjs + seajs构建Web Form前端(1)
bootstrap + angularjs + seajs构建Web Form前端(一) 简介 Bootstrap是Twitter推出的一个用于前端开发的开源工具包,它由Twitter的设计师Mark ...
- 领域驱动设计(DDD)的实际应用
领域驱动设计(DDD)的实际应用 笔者先前参与了一个有关汽车信息的网站开发,用于显示不同品牌的汽车的信息,包括车型,发动机型号,车身尺寸和汽车报价等信息.在建模时,我们只需要创建名为Car的实体( ...
- linux终端下文件不同颜色的含义
偶然注意到在终端下花花绿绿的目录显示效果,开始以为只是些特效,后来研究了一下,原来其中有些规律性的东西,总结如下: 蓝色表示目录:
- iOS基础 - Modal制作控制器
1.modal 1.modal推出控制器的代码 2.modal关闭当前控制器的代码 3.modal推出的动画效果 4.modal在ipad中应用 2.如何给控制器加上导航栏 3.modal和导航控制器 ...
- @Html.CheckBoxFor为何输出两种控件
在MVC中当使用@Html.CheckBoxFor时表单上会产生两种控件checkbox和hidden,比如: @Html.CheckBoxFor(model => model.IsTop) 对 ...
- 图解Javascript之字符串
好东西分享给大家,但要尊重事实!!!因此特别说明:本图非我本人亲自所作,乃我大天朝网友所绘制.个人感觉此图,覆盖全面,细节考虑甚周全,因此分享给大家,同时在此特别感谢网友的无私分享!
- Discuz! X2.5数据库字典(转)
DROP TABLE IF EXISTS pre_common_admincp_cmenu; CREATE TABLE pre_common_admincp_cmenu ( `id` SMALLINT ...