题面

该场 Div. 3 最“难”的一道题:Funny Substrings
OID\tt OIDOID 队长喜欢玩字符串,因为 “OneInDark”\tt “OneInDark”“OneInDark” 是一个望而生畏的字符串。

OID\tt OIDOID 会进行 N\tt NN 次操作,每次操作形如以下两种之一:

  • x := S : x 是变量名称,S 是一个具体的字符串,:= 符号两边都有空格。OID\tt OIDOID 把此时的 x 叫做 SYSYSY 变量。该操作意思是把 x 赋值为字符串 S。
  • x = a + b : x,a,b 是变量名称,= 符号和 + 符号两边都有空格。OID\tt OIDOID 把此时的 x 也叫做 SYSYSY 变量。该操作意思是把 x 赋值为 a 和 b 首尾拼接起来的字符串。保证 a 和 b 在此操作之前作为 SYSYSY 变量出现过。

现在问你,在最后一次出现的 SYSYSY 变量储存的字符串中,字符串 haha 作为子串出现过多少次。比如:hahahahahaha 中出现了 3 次。

一共 T≤103\tt T\leq10^3T≤103 组数据,每组数据中 1≤N≤50\tt1\leq N\leq501≤N≤50,1≤∣S∣≤5\tt1\leq|S|\leq51≤∣S∣≤5 ,1≤∣变量名∣≤5\tt1\leq|变量名|\leq51≤∣变量名∣≤5。

题解

(我看这道题过的人最少,姑且认为它难吧)

不难发现,最终的字符串长度可能超过 long long 范围,因此,直接 string 模拟不是个好方法。

我们会发现,对于一个字符串,有用的信息可以整理成一个三元组 {l(string),x(longlong),r(string)}\tt\{l(string),x(long~long),r(string)\}{l(string),x(long long),r(string)},分别表示:该字符串最左边 3 个(也许不足 3 个)字符,该字符串中 haha 的出现次数,该字符串最右边 3 个(也许不足 3 个)字符。

这个不难处理。关键是这样的三元组可以方便地定义 a + b 操作,返回另一个三元组:

  • 把 xa\tt x_axa​ 和 xb\tt x_bxb​ 加起作为 x\tt xx ,再把 ra\tt r_ara​ 和 lb\tt l_blb​ 拼起来(长度不超过 6),统计里面的 haha 数量,也加到 x\tt xx 里面去。
  • 把 l\tt ll 赋为 la\tt l_ala​ ,如果长度不足 3,再把 lb\tt l_blb​ 拼在 l\tt ll 后面,把长度超过 3 的砍掉。
  • 把 r\tt rr 赋为 rb\tt r_brb​ ,如果长度不足 3,再把 ra\tt r_ara​ 拼在 r\tt rr 前面,把长度超过 3 的砍掉。

这样就做出这道模拟题了,中间的字符串操作,可以暴力用 string 或者 char*+sprintf,时间足够。对于每个变量怎么存三元组,你可以用哈希也可以用 map

CODE

#include<set>
#include<map>
#include<queue>
#include<ctime>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 105
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
#define eps 1e-9
LL read() {LL f = 1,x = 0;char s = getchar();while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}return f * x;
}
int n,m,i,j,s,o,k;
struct it{char l[5],r[5];LL nm;it(){memset(l,0,sizeof(l));memset(r,0,sizeof(r));nm=0;}it(char *L,char *R,LL N){strncpy(l,L,3);nm=N;memset(r,0,sizeof(r));int le = strlen(R);for(int i = max(le-3,0),j=0;i < le;i ++,j ++) r[j]=R[i];}
};
it operator + (it a,it b) {char ss[10]; int ls; LL as = a.nm+b.nm;sprintf(ss,"%s%s",a.r,b.l);ls = strlen(ss);for(int i = 0;i <= ls-4;i ++) if(ss[i]=='h'&&ss[i+1]=='a'&&ss[i+2]=='h'&&ss[i+3]=='a') as ++;char rel[10],rer[10];if(strlen(a.l) < 3) sprintf(rel,"%s%s",a.l,b.l);else strcpy(rel,a.l);if(strlen(b.r) < 3) sprintf(rer,"%s%s",a.r,b.r);else strcpy(rer,b.r);return it(rel,rer,as);
}
map<string,it> mp;
int main() {int T = read();while(T --) {n = read();mp.clear();string las;for(int i = 1;i <= n;i ++) {string A,md,B,C;cin>>A;las = A;cin>>md;if(md[0]==':') {char ss[15]; int le,as = 0;scanf("%s",ss); le = strlen(ss);for(int i = 0;i <= le-4;i ++) {if(ss[i]=='h'&&ss[i+1]=='a'&&ss[i+2]=='h'&&ss[i+3]=='a') as ++;}mp[A] = it(ss,ss,(LL)as);}else {cin>>B;cin>>md;cin>>C;mp[A] = mp[B] + mp[C];}}printf("%lld\n",mp[las].nm);}return 0;
}

[CF1538E] Funny Substrings (模拟)相关推荐

  1. Gym - 101972H Beautiful Substrings(思维+模拟)

    题目链接:点击查看 题目大意:题目的意思挺难理解的..尤其是对我这种英语渣来说,简单说一下,就是先给出三个数字n,m,k,然后再给出两个字符串a和b,n和m代表的是字符串a和b的长度,然后描述题意: ...

  2. 字符串处理 —— 模拟与暴力

    [概述] 在某些题目中,需要对字符串进行处理,不需要很复杂的算法,只需要按照题意进行模拟或暴力枚举即可得出答案. [例题] 1.简单模拟 Minimum Ternary String(CF-1009B ...

  3. 模拟 之 zoj 3818 Pretty Poem

    // [9/12/2014 Sjm] /* 按题目要求进行模拟... 当初比赛时,WA了4次才AC掉,仅仅因为一句话:The symbol A, B and C are different conti ...

  4. HihoCoder - 1441 后缀自动机一·基本概念(模拟)

    描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称SAM).对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受且只 ...

  5. 【PAT】1093. Count PAT's (25)【模拟题】

    题目描述 The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th ...

  6. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  7. curl模拟post请求

    另外可尝试 postman工具 或者用request 直接请求 CURL 发送POST请求curl -header "Content-Type: application/json" ...

  8. flask_模拟请求post,get

    #coding:utf-8 import requestsres = requests.post(url="http://192.168.135.105:8888/",data={ ...

  9. 模拟内存计算如何解决边缘人工智能推理的功耗挑战

    模拟内存计算如何解决边缘人工智能推理的功耗挑战 How analog in-memory computing can solve power challenges of edge AI inferen ...

  10. 为放大器模拟输入模块提供可靠的输入过电压保护

    为放大器模拟输入模块提供可靠的输入过电压保护 Signal Chain Basics #159: Provide robust input overvoltage protection for amp ...

最新文章

  1. [SPDK/NVMe存储技术分析]012 - 用户态ibv_post_send()源码分析
  2. android平台 arcgisr_《ArcGIS Runtime SDK for Android开发笔记》——Android Studio基本配置与使用...
  3. CentOS 使用iso镜像安装本地 yum 源
  4. Python 深度学习库 Keras 发布官方中文文档,这里有你需要了解的一切
  5. SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
  6. 深入理解Java堆内存分配策略(Xmx和Xms)
  7. linux怎么运行idl,科学网—在Scientific linux 7上安装idl83 - 姜小川的博文
  8. HTC Vive开发笔记之手柄控制
  9. win10系统桌面右键新建卡顿、反应慢问题
  10. Hash函数经典用法
  11. AlgLib 使用----稀里糊涂
  12. Python通过m3u8文件下载合并ts视频
  13. C语言:int型数据向char型数据的强制类型转换原理
  14. 从小米手环4看雷军的AIOT思路进化
  15. java 阿拉伯语_用Java排序阿拉伯语单词
  16. Hibernate入门4.核心技能
  17. 产品经理知识体系:6.如何做好产品运营?
  18. java字符串去掉中文_Java——去除字符串中的中文
  19. ANFIS学习笔记(一)
  20. ESP8266 NodeMcu 连接onenet 保姆级教学

热门文章

  1. php中的implode,php里implode是什么意思
  2. Bit-Vector框架(1) — Reaching Definition Analysis
  3. gt、lt、ge、le、eq、ne的含义
  4. 从零开始学Swift计时器App开发
  5. elastic search 如何将yellow 状态变为green健康状态
  6. ELK集群状态yellow状态解决及解决思路
  7. 「 神器 」快速启动应用Wox
  8. 电脑DNS被劫持怎么办
  9. caioj 1290: 之乎者也
  10. 协调世界时--UTC