Atcoder [ABC283D] Scopet题解

题面

here

思路

Part.1 暴力

如你所见,暴力最高可达到平方级,TLE是妥妥的
亲测会T掉4个

Part.2 正解

考虑优化?
暴力时,我们总是浪费大量时间返回操作,那么,能不能第一次遍历时就记录呢?
我们考虑到,一旦左括号遇到右括号,那么,括号内的字母会被全部清除。我们可以设置一个状态变量,若在一个括号序列内,重复出现了字母,那么就判断无法成功。具体思路请看代码注释:

Code

#include<bits/stdc++.h>
using namespace std;
string s;
int box[10001];
int main(){
	cin >> s;
	int now=0;
	for (int i=0;i<s.size();i++){
		if (s[i]=='('){
			now=1;	//设置状态为在括号内
		}
		else if (s[i]==')') {
			now=0;//设置状态为在括号外
			memset(box,0,sizeof(box));//清空盒子
		}
		else {
			if (box[s[i]]) {//如果已经盒中有了,判断不行
				cout << "No\n";
				return 0;
			}
			box[s[i]]=true;//把小球放入盒子
		}
	}    
	cout << "Yes\n";
   	return 0;
}

posted @ 2023-01-09 15:30  fqEason  阅读(10)  评论(0)    收藏  举报