这题是一个kmp的应用,思路是有,但是代码实现能力太弱,细节考虑不全,敲了很长时间才AC。。

  题意:字符串用如下的方法表示,例如aaabbbbcc表示为3-a,4-b,2-c。那么问t串在s串中出现了多少次。这题的字符串总长是很长的,如果扩展为原长再kmp内存都不够。那么只能对缩写的状态进行kmp。

  方法如下:

  1.如果缩写长度为1,那么用这个在s串中每个进行比对字符和长度即可。

  2.如果为2,也类似于1。

  3.如果缩写长度大于3,那么由于头和尾匹配的时候不是需要长度也相等,只要长度小于或者等于即可,那么,先把头尾去掉。将身子进行kmp,每个点相同的条件应当是长度和字符都完全相等。其实这里可以写成pair来比较一个点更方便,但是我是用的两个数组,结果写的很挫。。当身子满足以后,再比较头和尾是否满足即可。

  这里有个注意点,在输入的时候如果相邻两个字符时相同的,需要合并,不然会出错。比方说3-a,4-a,用2-a去匹配,在3-a和4-a中间其实也可以放一个2-a,所以不合并的话答案就少了1。

  具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = +; char s[N],t[N],tt[N];
int lena,lenb;
ll numa[N],numb[N];
int nxt[N];
int f,e; void getnxt()
{
nxt[] = ;
int j = ;
for(int i=;i<=lenb-;i++)
{
while(j> && (tt[j+]!=tt[i] || numb[i]!=numb[j+]) ) j=nxt[j];
if(tt[j+] == tt[i] && numb[i]==numb[j+]) j++;
nxt[i]=j;
}
} ll kmp()
{
ll ans = ;
int j = ;
for(int i=;i<lena;i++)
{
while(j> && (tt[j+]!=s[i] || numa[i]!=numb[j+]) ) j=nxt[j];
if(tt[j+]==s[i] && numa[i]==numb[j+]) j++;
if(j == lenb-)
{
if(s[i-(lenb-)]==t[] && s[i+]==t[lenb] && numa[i-(lenb-)]>=f && numa[i+]>=e) ans++;
j = nxt[j];
}
}
return ans;
} int main()
{
int n,m;
lena = lenb = ;
cin>>n>>m;
for(int i=;i<=n;i++)
{
ll x;
char c[];
scanf("%I64d-%s",&x,c);
if(c[]==s[lena]) numa[lena] += x;
else
{
numa[++lena] = x;
s[lena] = c[];
}
} for(int i=;i<=m;i++)
{
ll x;
char c[];
scanf("%I64d-%s",&x,c);
if(c[]==t[lenb]) numb[lenb] += x;
else
{
numb[++lenb] = x;
t[lenb] = c[];
}
} ll ans = ;
if(lenb == )
{
for(int i=;i<=lena;i++)
{
if(s[i]==t[] && numa[i]>=numb[])
{
ans += (ll)numa[i]-numb[]+;
}
}
}
else if(lenb == )
{
for(int i=;i<lena;i++)
{
if(s[i]==t[] && s[i+]==t[] && numa[i]>=numb[] && numa[i+]>=numb[]) ans ++;
}
}
else
{
strcpy(tt+,t+);
tt[lenb] = ;
f = numb[],e = numb[lenb];
for(int i=;i<lenb;i++) numb[i]=numb[i+]; getnxt();
ans = kmp();
}
printf("%I64d\n",ans);
return ;
}

CodeForces 631D Messenger —— (kmp的应用)的更多相关文章

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

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

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

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

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

  6. CF #344 D. Messenger KMP/Z

    题目链接:http://codeforces.com/problemset/problem/631/D 给定两个压缩形式的字符串,如a3b5a4k7这样的形式 问A在B中出现次数. 分类讨论,如果A是 ...

  7. CodeForces 25E Test KMP

    Description Sometimes it is hard to prepare tests for programming problems. Now Bob is preparing tes ...

  8. Codeforces 126B. Password (KMP)

    <题目链接> 题目大意:给定一个字符串,从中找出一个前.中.后缀最长公共子串("中"代表着既不是前缀,也不是后缀的部分). 解题分析:本题依然是利用了KMP中next数 ...

  9. Codeforces 126B(kmp)

    要点 头尾的最长相同只要一个kmp即可得,于是处理中间部分 扫一遍记录一下前缀的每个位置是否存在一个中间串跟它相同,见代码 如果当前没有,接着用Next数组去一找即可 #include <cst ...

随机推荐

  1. Inversion 多校签到题

    存下值和下标后排序,每次从坐后面开始取就可以了. ac代码: #include <algorithm> #include <cstdio> #include <cstri ...

  2. PHP如何通过URL访问,获得新的URL 两种方法

    1.1 $url = 'http://passport.drcloud.cn/api/logon.asp?id=1&ru=http://203.158.158.122/store/thirdL ...

  3. 安装 node.js npm,cnpm

    参考:https://blog.csdn.net/suiyuehuimou/article/details/74143436 https://www.liaoxuefeng.com/wiki/0014 ...

  4. javaIO——BufferedWriter

    [环境] jdk1.8 前面学习过 BufferedReader,是缓冲字符输入流.那么今天来学习对应的缓冲字符输出流类:BufferedWriter.跟 BufferedReader 同理,它也是一 ...

  5. EF Core的级联删除

    级联删除由DeleteBehavior的枚举值来设置: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项/子项的影响 Cascade 删除实体 删除实体 ClientSetNull 外键属性 ...

  6. 如何对Nginx日志文件进行切割保存

    日积月累下,日志文件会越来越大,日志文件太大严重影响服务器效率,须要定时对日志文件进行切割. 切割的方式有按月切割.按天切割.按小时切割,一般都是按天切割. 那么如何进行切割呢? 思路: 创建日志文件 ...

  7. ASE19团队项目alpha阶段model组 scrum3 记录

    本次会议于11月5日,19时整在微软北京西二号楼sky garden召开,持续25分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing W ...

  8. async/await 处理多个网络请求同步问题

    1.async/await是基于Promise的,是进一步的一种优化,await会等待异步执行完成 getProjectTask(id){ this.axios.get('/api/v1/task/' ...

  9. 自己整理的的数据操作DbHelper

    using System.Data; using System.Data.SqlClient; using System.Configuration; namespace WindowsFormsAp ...

  10. idea代码爆红,clean,或者maven reimport都不起作用

    1 突然自己的idea的Maven项目代码都是爆红,但是可以运行,添加新的代码确无法运行 尝试了clean,或者reimport,甚至是大家推荐的,刷新缓存重启也没有作用 2 检查项目的jdk配置,也 ...