1 条题解
-
0
题目大意
有一个隐藏的字符串 ,你每天可以询问 中的一个字符并将一个小于 的非负整数传给下一天。
你需要在 天内判断出此字符串是否合法。
题目思路
我们可以先找到一个左括号,然后去寻找和它匹配的右括号。
所以可以从此左括号开始不断往后找,使用一个变量 ,遇到左括号就把 加一 ,否则就减一。当 第一次为 时,此位置的括号即为与它匹配的括号。 匹配完之后再带回去一个 代表此右括号的位置。之后从 继续往后找即可。
解决此过程需要储存当前位置 ,上文的 ,上文的 ,和一个状态 。
状态 有 种情况,分别是寻找左括号,往前找与之前的左括号匹配的括号,匹配左括号中和匹配右括号中。
传递的数最大为 ,符合要求。
参考代码
#include<bits/stdc++.h> using namespace std; char Get(int I); int Memory(int N,int M){ int a=M%100,b=M/100%100,c=M/10000%100,d=M/1000000; if(a>=N)return 0; char ch=Get(a+1); if(!d)return ((a+1==N||ch=='>'||ch==']')?-2:2000001+a+1000000*(ch=='<')); else if(d==1){ c+=((ch==']'||ch=='>')?1:-1); return (c==-1?(b==N-1?-2:2000001+b+1000000*(ch=='<')):(a==0?(b==N-1?-1:b+1):a-1+b*100+c*10000+1000000)); } else if(d==2)return (ch==']'?a*101+1000000:((a==N-1||ch=='>')?-2:2000001+a+1000000*(ch=='<'))); else return (ch=='>'?a*101+1000000:((a==N-1||ch==']')?-2:2000001+a+1000000*(ch=='<'))); }
- 1
信息
- ID
- 8457
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者