[CF1538E] Funny Substrings (模拟)
题面
该场 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
作为子串出现过多少次。比如:haha
在 hahahaha
中出现了 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
#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 (模拟)的更多相关文章
- CodeForces 550A Two Substrings(模拟)
[题目链接]click here~~ [题目大意]: You are given string s. Your task is to determine if the given string s ...
- 【CF1029A】Many Equal Substrings(模拟)
题意:给定一个长度为n的串s,要求构造一个长度最小的使s出现了k次的串,可以重叠 n<=50,k<=50 思路:计算一下前后缀相同长度 #include<cstdio> #in ...
- poj 3415 Common Substrings(后缀数组+单调栈)
http://poj.org/problem?id=3415 Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Sub ...
- Advanced Fruits(好题,LCS的模拟)
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 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 ...
- HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力)
HDU 5908 Abelian Period (BestCoder Round #88 模拟+暴力) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=59 ...
- Codeforces 626A Robot Sequence(模拟)
A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- 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 ...
- hdu4886 TIANKENG’s restaurant(Ⅱ) (trie树或者模拟进制)
TIANKENG’s restaurant(Ⅱ) Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 130107/65536 K (Ja ...
随机推荐
- Kubernetes将弃用Docker!与 containerd容器引擎
时间戳:2022-06-07 20:32:19 星期二 撰写文档参考:(阿良-腾讯课堂)Kubernetes将弃用Docker 参考博客k8s入坑之路(3)containerd容器 container ...
- 【Redis】ziplist压缩列表
压缩列表 压缩列表是列表和哈希表的底层实现之一: 如果一个列表只有少量数据,并且数据类型是整数或者比较短的字符串,redis底层就会使用压缩列表实现. 如果一个哈希表只有少量键值对,并且每个键值对的键 ...
- Canal搭建
目录 搭建环境 MySQL环境 Canal环境 客户端 总结 需求:解决私有环境数据库的基础数据同步问题,每当中心库基础数据发生改变时,其他私有库都会增量同步 Canal主要用途是基于 MySQL 数 ...
- ms12-020漏洞
一.环境说明 kali linux windows 7 sp1 二.ms12-020漏洞利用 msf5 exploit(windows/browser/ms10_002_aurora) > se ...
- 4种方法教你如何查看java对象所占内存大小
摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...
- Numpy的ndarray数组基础
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. 1.数组的 ...
- 国外价值10K+美金的Python面试题,珍藏已久,含泪放了出来
兄弟们,没吹牛皮,一哥们在国外面试的时候,就是要他做的这个,直接给他说,做出来了给你15K(单位是刀),做不出来就拜拜~ 大兄弟当时就不服了,这不是看不起我么,分分钟就给整完了~ 我上我也行系列: 唠 ...
- Python教程:随机验证码生成和join 字符串
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...
- [MRCTF2020]Ezpop-1|php序列化
1.打开题目获取到源代码信息,如下: Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From h ...
- docker下node环境搭建
初始化⼀个NodeJs程序 以下操作必须已经安装了NodeJS. ⾸先创建⼀个空⽂件夹.并创建以下⽂件: server.js package.json Dockerfile .dockerignore ...