$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的更多相关文章

  1. codeforces 631D. Messenger kmp

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

  2. Codeforces 631D Messenger【KMP】

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

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

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

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

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

  5. codeforces 1288E. Messenger Simulator(树状数组)

    链接:https://codeforces.com/contest/1288/problem/E 题意:序列p的长度为n,初始序列为1 2 3 4 ...n,然后有m次操作,每次指定序列中一个数移动到 ...

  6. 631D Messenger

    题目大意 给你串s和t 但是每个串都被表示为多个二元组(x,y)表示字符x连续出现y次 问t在s中出现了多少次 分析 我们先将s和t每个串中二元组合并 即相邻两个二元组如果字符相等则将它们变为一个 特 ...

  7. Codeforces Round #344 (Div. 2) D. Messenger kmp

    D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ...

  8. Codeforces Round #344 (Div. 2) D. Messenger (KMP)

    D. Messenger time limit per test2 seconds memory limit per test512 megabytes inputstandard input out ...

  9. Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator

    可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j>=i 的不同数 ...

随机推荐

  1. SQL Server的链接服务器(MySQL、Oracle、Ms_sql、Access、SYBASE)

    原文:SQL Server的链接服务器(MySQL.Oracle.Ms_sql.Access.SYBASE) 一.使用 Microsoft OLE DB Provider For ODBC 链接MyS ...

  2. 设置符合条件的DataGridView的行的颜色的两种方法

    Private Sub dgvInfo_RowPrePaint(sender As Object, e As DataGridViewRowPrePaintEventArgs) Handles dgv ...

  3. Apache JMeter--网站自动测试与性能测评

    Apache JMeter--网站自动测试与性能测评 2013-02-28 15:48:05 标签:Jmeter From:http://bdql.iteye.com/blog/291987 出于学习 ...

  4. 读书笔记—CLR via C#章节11-13

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  5. apache 提示You don't have permission to access /test.php on this server.怎样解决

    把denty改成allow httpd.conf文件中. <Directory "cgi-bin"> AllowOverride None Options None O ...

  6. Android项目--获取系统通讯录列表

    ----------------- 通讯录列表 ----------------- 按常理来说,获取系统通讯录列表,无非就是将通讯录的数据库打开获取数据,适配,添加即可. Cursor cursor; ...

  7. beanutils中Lazy

    public class LazyBean { //    public static void main(String[] args) {//        DynaBean dynaBean=ne ...

  8. jboss7.1.0配置数据库(mysql)

    以jboss7.1.0和mysql为例 1.找到安装目录,我的目录是:jboss-as-7.1.0.CR1b 2.找到standalone.xml,这个文件在我的电脑上是C:\Users\dan\De ...

  9. C# 学习笔记1 .NET平台,C#的重要概念

    .NET平台构成的三个关键实体是: 1.CLR(公共语言运行库):为我们定位,加载,管理.NET类型,同时负责一些底层细节的工作,如内存管理,应用托管,处理线程,安全检查等,它包含了一个重要名为msc ...

  10. C#中一些易混淆概念总结

    C#中一些易混淆概念 这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框 ...