P3952 时间复杂度

时间复杂度

给出一段代码和计算出的时间复杂度,求代码是否合法,若合法,验证计算的复杂度是否正确。

一看就是大模拟。

首先你要会正确的读入,可以考虑直接写一个相关函数读入。

然后是模拟的具体情况,显然需要一个栈。

先不管代码不合法的情况:

  1. \(F\),将当前变量名入栈,同时记录其是否影响总时间复杂度,还有是否被执行。
  2. \(E\),将栈顶出栈,若栈顶为记录的最早不被执行的循环,则更改记录。

如果在步骤 \(2\) 出栈时栈为空,或者最后栈不为空,或者变量重名,则判断为不合法。

最后需要注意很多具体细节。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 110;
const int INF = 1 << 30;
int T, n, stk[N];
char str[20], code[N][20];
bool vis[30], used[30];

void Read(int i){
	int x = 0; char c = getchar();
    while(c != 'F' && c != 'E') c = getchar();
	while(c != '\n' && c != '\r' && c != EOF){
		code[i][++ x] = c;
		c = getchar();
	}
}

int Get_Num(char* str, int &pos){
	while(str[pos] < '0' || str[pos] > '9')
		if(str[pos ++] == 'n') return INF;
	int x = 0;
	while(str[pos] >= '0' && str[pos] <= '9')
		x = x * 10 + str[pos ++] - '0';
	return x;
}

int work(){
	for(int i = 1; i <= n; i ++) Read(i);
	int ans = 0, now = 0, tot = 0, flag = 0;
	memset(vis, false, sizeof(vis));
	memset(used, false, sizeof(used));
	
	for(int i = 1; i <= n; i ++)
		if(code[i][1] == 'F'){
			int nam = code[i][3] - 'a';
			if(vis[nam]) return -1;
			vis[nam] = true, stk[++ tot] = nam;
			if(flag) continue;
			
			int Begin = 5;
			int s = Get_Num(code[i], Begin);
			int t = Get_Num(code[i], Begin);
			if(t - s > 1e5){
				ans = max(ans, ++ now);
				used[nam] = true;
			}
			else if(t < s) flag = nam;
		}
		else{
			if(!tot) return -1;
			int nam = stk[tot --];
			vis[nam] = false;
			if(flag == nam) flag = 0;
			if(used[nam])
				used[nam] = false, now --;
		}
	if(tot) return -1;
	return ans;
}

int main(){
	scanf("%d", &T);
	while(T --){
		scanf("%d", &n);
		scanf("%s", str + 1);
		int now;
		if(str[3] == '1') now = 0;
		else{
			int Begin = 5;
			now = Get_Num(str, Begin);
		}
		int ans = work();
		if(ans == -1) puts("ERR");
		else if(ans == now) puts("Yes");
		else puts("No");
	}
	return 0;
}
上一篇:B. Shifting Sort CF1579B


下一篇:题解 Aizu2970 【Permutation Sort】