给出一段代码和计算出的时间复杂度,求代码是否合法,若合法,验证计算的复杂度是否正确。
一看就是大模拟。
首先你要会正确的读入,可以考虑直接写一个相关函数读入。
然后是模拟的具体情况,显然需要一个栈。
先不管代码不合法的情况:
- \(F\),将当前变量名入栈,同时记录其是否影响总时间复杂度,还有是否被执行。
- \(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;
}