首页 > 其他分享 >趣题

趣题

时间:2023-09-01 16:44:26浏览次数:23  
标签:return val int top pos 趣题 now

Prob 1

JOISC2015 Limited Memory

现在有一个字符串 \(S\),由 <,>,[,] 构成。现在只告诉你他的长度,你想要知道他是不是一个合法的括号串。

你需要实现一个函数 memory,每次你可以询问一次某个位置的字符,然后你需要返回一个 \([0,2^{22}-1]\) 的整数或者 \(-1,-2\)。如果返回 \(-1\) 代表这是一个括号串,\(-2\) 代表不是。否则你可以将你上次返回的整数作为参数再传入 memory 函数。

你需要再只使用该参数的情况下回答问题。你最多可以调用 \(15000\) 次 memory 函数。\(1\le |S|\le 100\)。

谔谔只能用 \(22\) 位,所以不能直接用一个栈来匹配。但是我们发现长度貌似很短,所以考虑直接对每个位置判断他能否匹配。\((i,j)\) 显然能够匹配的必要条件是 \([i+1,j-1]\) 这之间的数都得匹配上(当然这俩还得适配)。但是我们发现此时不再关心 \([i+1,j-1]\) 里 <,[ 的区别了。于是我们只需要记以下几个东西:

  • 目前需要被匹配的位置(7位)
  • 目前需要被匹配的类型(1位)
  • 目前栈的大小(7位)
  • 目前枚举到的位置(7位)

刚好 22 位,那么这道题就做完了。具体的细节可以参考代码。

#include<bits/stdc++.h>
#include "memory.h"
using namespace std;
char Get(int I);
// 字符串的范围是 [1, N] 
int calc(int type, int pos, int top, int now) {
	int ret = type | (pos << 1) | (top << 8) | (now << 15);
	return ret;
}
bool check(char ch) {
	// 判断是不是左括号 
	return ch == '<' || ch == '[';
}
int Memory(int N, int M) {
	if (N & 1) return -2;
	if (!M) return calc(0, 1, 1, 1);// 开始配对了 
	int type = M & 1, pos = (M >> 1) & 127, top = (M >> 8) & 127, now = (M >> 15) & 127;
	if (pos > N) return -1;// 尝试完了 
	if (pos < 1 || top < 1) return -1;// 错误的输入 
	if (now < 1 || now > N) return -2;// 没有找到匹配的位置 
	char val = Get(now);
	if (pos == now) {
		// 尝试匹配 pos 这个位置 
		if (check(val)) {// 往右枚举 
			return calc(val == '[', pos, 1, now + 1); 
		} else {// 往左枚举 
			return calc(val == ']', pos, 1, now - 1);
		}
	} else if (now > pos) {
		// s[pos] 是个左括号 
		if (!check(val)) top--;
		else top++;
		if (!top) return val == ">]"[type] ? calc(0, pos + 1, 1, pos + 1) : -2;
		else return calc(type, pos, top, now + 1); 
	} else {
		// s[pos] 是个右括号 
		if (check(val)) top--;
		else top++;
		if (!top) return val == "<["[type] ? calc(0, pos + 1, 1, pos + 1) : -2;
		else return calc(type, pos, top, now - 1); 
	}
}

题目来源

[1] : https://loj.ac/p/3005

标签:return,val,int,top,pos,趣题,now
From: https://www.cnblogs.com/zcr-blog/p/17672324.html

相关文章

  • 2023冬 密码学趣题——3
    NSSCTFRound7Crypto2一道DFS深搜解决的Crypto问题,近期遇到了好多类似问题,例如2022祥云杯的leak_rsa,pwnhub冬季赛的ASR等使用DFS相比较暴力枚举可以获得较大程度的时间......
  • hgame趣题——4
    stream一个python生成的exe反编译的问题,首先使用pyinstxtractor.py得到反编译的pyc文件这里缺了.pyc文件的文件头需要补一下利用在线网站得到反编译的python代码(还是在......
  • 2023冬 密码学趣题——2
    HITCTF2022revcalcimportstringp=2**607-1defs(a,b):return(a+b)%pdefu(a,b):return(a-b)%pdefm(a,b):returna*b%p......
  • 2022冬 密码学趣题——1
    HITCTFweird_relationshipfromsecretimportflag#rsakeygenerationphase:)ahintforyou#q=1#whilenotis_prime(q):#p=random_prime(2**512)......
  • 2023 hgame趣题——3
    v2board搜索一下发现是最近的一个洞,主要是越权的问题,管理员鉴权的代码只判断了用户提交的token是否存在于服务器缓存抄个作业:https://youtu.be/yfneS2R-Pn8首先注册个账......
  • 2023 hgame趣题——2
    Helpmarvin最近在做hgameweek3的题,强度不小,Bi0s剩下那个密码(bad2code)过些天再更,今天发一个hgameweek1的IoT题目。SPI协议用单独的数据线和单独的时钟信号来保证发送......
  • 2023 hgame趣题——1
    hgame2023week2Transfer借hgame开始入门学习自己一直想接触的Blockchain方向,在四周的比赛时间内会记录hgame中有趣的问题,Crypto方向等a掉四周的题目一起放出来源代码:......
  • 关于一道MISC的有趣题
    题目只给了一个压缩包flag,是下面这个对吧  然后会发现他有个flag.txt对吧  点开发现是一串及其像base64的东西,我们拿他去解密,会发现很乱,但是有PK!!有PK想到什么?想......
  • 数论趣题
    1.CF1470B考虑到原条件可以转化为\(\sqrt{xy}\in\Z_{+}\)然后我们去掉\(x,y\)中的平方因子后,等价于\(x'=y'\)。那么其实就维护这个\(x'\)就好了。我们发现......
  • 偶然遇到的一些均摊趣题
    1.CF1774F1考虑一个repeat操作发生了甚么:假设现在全局一共扣除了\(m\)的血量,现在所拥有的猪的集合\(S\)那么操作相当于把所有\(S\)中的猪的血量去掉\(m\)扔进......