社区讨论

关于输入

P3952[NOIP 2017 提高组] 时间复杂度参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mdssa78w
此快照首次捕获于
2025/08/01 20:12
7 个月前
此快照最后确认于
2025/11/04 05:54
4 个月前
查看原帖
这份代码的输入会读入一些不正常的东西,求 dalao 改改。
CPP
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
ll T, l, num, cnt;
string O;
string s[110];
unordered_map<char, bool> name;
bool CheckSyntaxError(){
	ll cntF = 0;
	for(ll i = 1; i <= l; i++){
		if(s[i][1] == 'F') cntF++;
		if(s[i][1] == 'E'){
			if(!cntF) return 1;
			cntF--;
		}
	}
	if(cntF > 0) return 1;
	//--------------------------end 和 for 不匹配--------------------------
	name.clear();
	for(ll i = 1; i <= l; i++){
		if(s[i][1] == 'F'){
			if(name[s[i][3]] == 1) return 1;
			name[s[i][3]] = 1;
		}else
			for(ll j = i - 1; j >= 1; j--)
				if(s[j][1] == 'F'){
					name[s[j][3]] = 0;
					break;
				}
	}
	//--------------------------变量名冲突--------------------------
	return 0; 
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> T;
	while(T--){
		cin >> l; getchar();;
		getline(cin, O), O = '_' + O;
		for(ll i = 1; i <= l; i++) getline(cin, s[i]), s[i] = '_' + s[i], getchar();
		if(CheckSyntaxError()){
			cout << "ERR\n"; continue;
		}
		ll num = 0;
		if(O[3] == '1') goto egg;
		for(ll i = 5; ; i++){
			if(!isdigit(O[i])) break;
			num = num * 10 + (O[i] - '0');
		}
		egg:;
		// 输入的时间复杂度为 O(n^num)
		ll real = 0;
		for(ll i = 1; i <= l; i++){
			if(s[i][1] == 'E') continue;
			ll a = 1, b = 1;
			ll now = 1;
			for(ll j = 5; j < s[i].size(); j++){
				if(s[i][j] == 'n'){
					if(now == 1) a = 9e18, now++;
					else b = 9e18;
				}else if(isdigit(s[i][j]))
					if(now < 2) now++;
			}
			if(a == 1 && b > 1) real++;
		}
		// 实际的时间复杂度为 O(n^real)
		if(num == real) cout << "Yes\n";
		else cout << "No\n"; 
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...