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 的不同数 ...
随机推荐
- vs 文件头自动添加注释
原文:vs 文件头自动添加注释 vs2010 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates ...
- 笔试 - 高德软件有限公司python问题 和 答案
高德软件有限公司python问题 和 答案 本文地址: http://blog.csdn.net/caroline_wendy/article/details/25230835 by Spike 20 ...
- bash下几个替换运算符的区分
bash下几个替换运算符的区分 2012-03-21 22:20:54 分类: Python/Ruby 一直对四个替换运算符比较的迷惑,分布太清楚,记下来避免再次遗忘: ${name:-word} ...
- 完美的拥抱GitHub
Visual Studio 2012完美的拥抱GitHub 前言 一直以来都想使用Git来管理自己平时积累的小代码,就是除了工作之外的代码了.有时候自己搞个小代码,在公司写了,就要通过U盘或者网盘 ...
- IOS UI 第六篇:基本UI
加两个UI模块 - (void)viewDidLoad{ [self begin1]; [self begin2]; [super viewDidLoad]; // Do ...
- IOS开发小功能2:二维码扫描界面的设计(横线上下移动)
效果图如上,实现的是一个二维码扫描界面. 下面我贴出线条上下移动的代码,至于二维码的代码是用的第三方库. 首先是整体的结构: 注意下面的库文件一个都不能少,否则会报错. TLTiltHighlight ...
- NuGet安装及简单使用
通过Visual Studio安装NuGet 直接下载并安装NuGet 一.通过Visual Studio安装NuGet 打开Visual Studio扩展管理器 2.选择联机库,并在搜索中写入NuG ...
- nginx日志简单分析工具
自己有个tony6.com的服务器,上面挂着我的博客,web服务器是nginx. 由于最近一直在折腾python,所以简单写了个nginx日志分析工具,它可以分析出每个IP的点击数量和IP所在地. # ...
- CSS3:三个矩形,一个宽200px,其余宽相等且自适应满铺
某公司面试题:下图绿色区域的宽度为100%,其中有三个矩形,第一个矩形的宽度是200px,第二个和第三个矩形的宽度相等.使用CSS3中的功能实现它们的布局. 这里要用到的CSS3特性box-flex ...
- jquery选择器之属性过滤选择器
<style type="text/css"> /*高亮显示*/ .highlight{ background-color: gray } </style> ...