题面

该场 Div. 3 最“难”的一道题:Funny Substrings

O

I

D

\tt OID

OID 队长喜欢玩字符串,因为

O

n

e

I

n

D

a

r

k

\tt “OneInDark”

“OneInDark” 是一个望而生畏的字符串。

O

I

D

\tt OID

OID 会进行

N

\tt N

N 次操作,每次操作形如以下两种之一:

  • x := S : x 是变量名称,S 是一个具体的字符串,:= 符号两边都有空格。

    O

    I

    D

    \tt OID

    OID 把此时的 x 叫做

    S

    Y

    SY

    SY 变量。该操作意思是把 x 赋值为字符串 S。

  • x = a + b : x,a,b 是变量名称,= 符号和 + 符号两边都有空格。

    O

    I

    D

    \tt OID

    OID 把此时的 x 也叫做

    S

    Y

    SY

    SY 变量。该操作意思是把 x 赋值为 a 和 b 首尾拼接起来的字符串。保证 a 和 b 在此操作之前作为

    S

    Y

    SY

    SY 变量出现过。

现在问你,在最后一次出现的

S

Y

SY

SY 变量储存的字符串中,字符串 haha 作为子串出现过多少次。比如:hahahahahaha 中出现了 3 次。

一共

T

1

0

3

\tt T\leq10^3

T≤103 组数据,每组数据中

1

N

50

\tt1\leq N\leq50

1≤N≤50,

1

S

5

\tt1\leq|S|\leq5

1≤∣S∣≤5 ,

1

5

\tt1\leq|变量名|\leq5

1≤∣变量名∣≤5。

题解

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

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

我们会发现,对于一个字符串,有用的信息可以整理成一个三元组

{

l

(

s

t

r

i

n

g

)

,

x

(

l

o

n

g

l

o

n

g

)

,

r

(

s

t

r

i

n

g

)

}

\tt\{l(string),x(long~long),r(string)\}

{l(string),x(long long),r(string)},分别表示:该字符串最左边 3 个(也许不足 3 个)字符,该字符串中 haha 的出现次数,该字符串最右边 3 个(也许不足 3 个)字符。

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

  • x

    a

    \tt x_a

    xa​ 和

    x

    b

    \tt x_b

    xb​ 加起作为

    x

    \tt x

    x ,再把

    r

    a

    \tt r_a

    ra​ 和

    l

    b

    \tt l_b

    lb​ 拼起来(长度不超过 6),统计里面的 haha 数量,也加到

    x

    \tt x

    x 里面去。

  • l

    \tt l

    l 赋为

    l

    a

    \tt l_a

    la​ ,如果长度不足 3,再把

    l

    b

    \tt l_b

    lb​ 拼在

    l

    \tt l

    l 后面,把长度超过 3 的砍掉。

  • r

    \tt r

    r 赋为

    r

    b

    \tt r_b

    rb​ ,如果长度不足 3,再把

    r

    a

    \tt r_a

    ra​ 拼在

    r

    \tt r

    r 前面,把长度超过 3 的砍掉。

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

CODE

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<ctime>
  5. #include<cmath>
  6. #include<vector>
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<iostream>
  10. #include<algorithm>
  11. using namespace std;
  12. #define MAXN 105
  13. #define ENDL putchar('\n')
  14. #define LL long long
  15. #define DB double
  16. #define lowbit(x) ((-x) & (x))
  17. #define eps 1e-9
  18. LL read() {
  19. LL f = 1,x = 0;char s = getchar();
  20. while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
  21. while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
  22. return f * x;
  23. }
  24. int n,m,i,j,s,o,k;
  25. struct it{
  26. char l[5],r[5];
  27. LL nm;it(){memset(l,0,sizeof(l));memset(r,0,sizeof(r));nm=0;}
  28. it(char *L,char *R,LL N){
  29. strncpy(l,L,3);nm=N;memset(r,0,sizeof(r));
  30. int le = strlen(R);
  31. for(int i = max(le-3,0),j=0;i < le;i ++,j ++) r[j]=R[i];
  32. }
  33. };
  34. it operator + (it a,it b) {
  35. char ss[10]; int ls; LL as = a.nm+b.nm;
  36. sprintf(ss,"%s%s",a.r,b.l);
  37. ls = strlen(ss);
  38. 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 ++;
  39. char rel[10],rer[10];
  40. if(strlen(a.l) < 3) sprintf(rel,"%s%s",a.l,b.l);
  41. else strcpy(rel,a.l);
  42. if(strlen(b.r) < 3) sprintf(rer,"%s%s",a.r,b.r);
  43. else strcpy(rer,b.r);
  44. return it(rel,rer,as);
  45. }
  46. map<string,it> mp;
  47. int main() {
  48. int T = read();
  49. while(T --) {
  50. n = read();
  51. mp.clear();
  52. string las;
  53. for(int i = 1;i <= n;i ++) {
  54. string A,md,B,C;
  55. cin>>A;
  56. las = A;
  57. cin>>md;
  58. if(md[0]==':') {
  59. char ss[15]; int le,as = 0;
  60. scanf("%s",ss); le = strlen(ss);
  61. for(int i = 0;i <= le-4;i ++) {
  62. if(ss[i]=='h'&&ss[i+1]=='a'&&ss[i+2]=='h'&&ss[i+3]=='a') as ++;
  63. }
  64. mp[A] = it(ss,ss,(LL)as);
  65. }
  66. else {
  67. cin>>B;cin>>md;cin>>C;
  68. mp[A] = mp[B] + mp[C];
  69. }
  70. }
  71. printf("%lld\n",mp[las].nm);
  72. }
  73. return 0;
  74. }

[CF1538E] Funny Substrings (模拟)的更多相关文章

  1. CodeForces 550A Two Substrings(模拟)

    [题目链接]click here~~  [题目大意]:  You are given string s. Your task is to determine if the given string s ...

  2. 【CF1029A】Many Equal Substrings(模拟)

    题意:给定一个长度为n的串s,要求构造一个长度最小的使s出现了k次的串,可以重叠 n<=50,k<=50 思路:计算一下前后缀相同长度 #include<cstdio> #in ...

  3. poj 3415 Common Substrings(后缀数组+单调栈)

    http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Sub ...

  4. Advanced Fruits(好题,LCS的模拟)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. CF 319D(Have You Ever Heard About the Word?-模拟)

    D. Have You Ever Heard About the Word? time limit per test 6 seconds memory limit per test 256 megab ...

  6. HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力)

    HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=59 ...

  7. Codeforces 626A Robot Sequence(模拟)

    A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  8. Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】

    传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...

  9. hdu4886 TIANKENG’s restaurant(Ⅱ) (trie树或者模拟进制)

    TIANKENG’s restaurant(Ⅱ) Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 130107/65536 K (Ja ...

随机推荐

  1. 使用VMware安装Ubuntu虚拟机

    一.下载安装VM软件 这一步跳过,因为网上都能找到下载地址,下载后一步一步的安装即可,网上也有很多下载地址,这里提供一个Windows的下载链接. 链接: https://pan.baidu.com/ ...

  2. LoRa模块无线收发通信技术详解

    LoRa是一种LPWAN通信技术,它基于扩频技术而广泛应用于超长距离的无线传输场景中.现在,LoRa主要在全世界433.868.915MHz等自由频带工作.其最大特征是灵敏度高,传输距离长,工作功耗低 ...

  3. LVGL库入门教程02-基本控件与交互

    LVGL 本质上是一个 GUI 库,它包含大量的控件(widget),即按钮.标签.滑块.菜单栏这种具有一定人机交互特征的组合图形.LVGL 在设计时,采用了一定面向对象编程的设计思路,有效降低了代码 ...

  4. linux-基于tensorflow2.x的手写数字识别-基于MNIST数据集

    数据集 数据集下载MNIST 首先读取数据集, 并打印相关信息 包括 图像的数量, 形状 像素的最大, 最小值 以及看一下第一张图片 path = 'MNIST/mnist.npz' with np. ...

  5. 使用Karmada实现Helm应用的跨集群部署

    摘要:借助Karmada原生API的支持能力,Karmada可以借助Flux轻松实现Helm应用的跨集群部署. 本文分享自华为云社区< 使用Karmada实现Helm应用的跨集群部署[云原生开源 ...

  6. python这不是有手就行?——python音频处理基础知识

    大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...

  7. SSH 多密钥配置

    目录 前言 一.SSH 是什么 二.密钥生成工具 三.密钥类型 四.本地配置 1.单密钥配置 2.多密钥配置 五.远端配置 1.GitHub/Gitee 2.服务器 前言 当我们从 GitHub 克隆 ...

  8. day03 Java_运算符_分支结构

    列表: 运算符的练习:算术.关系.逻辑.赋值.字符串连接.条件 分支结构的练习:if结构 分支结构的练习:if...else结构 参考 运算符的练习:算术 输出几个整数取模,验证结果 声明两个整型变量 ...

  9. C# 基础知识-反射

    一.反射 1>反射的命名空间是System.Reflection 2>是.Net框架提供的帮助类库,读取并使用matedata 二.反射基本用法 举例如下 1>Assembly as ...

  10. 递归概念&分类&注意事项和使用递归计算1-n之间的和

    递归 概述 递归:指在当前方法内调用自己的这种现象. 递归的分类: 递归分为两种,直接递归和间接递归 直接递归称为方法自身调用自己 简介递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法 注 ...