【模擬】洛谷_3952 時間複雜度
阿新 • • 發佈:2019-01-05
題意
給出幾個語句,判斷它們的時間複雜度是否符合,如果是的話輸出‘Yes’,不然輸出’No’,編譯錯誤的話輸出‘ERR’。
思路
比較長的模擬。
用一個check判斷時間複雜度和是否有編譯錯誤,最後比較輸出。
程式碼
#include<stack>
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int T, N, ans1, ans2;
string o;
string code[101];
int sread(int &x, string s) {//查詢串中數字
int result = 0, l = s.size();
while ((s[x] < '0' || s[x] > '9') && x < l) {
if (s[x] == 'n') {
x++;
return 10000;//N
}
x++;
}
while (s[x] >= '0' && s[x] <= '9') {
result = result * 10 + s[x] - 48;
x++;
}
return result;
}
int geto() {//求出時間複雜度
int x = 3;
if (o[2] == 'n') return sread(x, o);
else return 0;
}
int check() {
int result = 0, now = 0, flag = -1, k, a, b, x;
stack<int> z;
bool ins[26] = {0}, con[26] = {0};//判斷是否在棧裡,以及是否對迴圈有貢獻
for (int i = 1; i <= N; i++) {
if (code[i][0] == 'F') {
k = code[i][2] - 97;
if (ins[k]) return -1;//重名,編譯錯誤
z.push(k);
ins[k] = 1;
x = 4;
a = sread(x, code[i]);
b = sread(x, code[i]);
if (b - a > 1000) {
if (flag == -1) {//flag記錄第一個沒有貢獻的變數
con[k] = 1;
now++;//記錄當前迴圈複雜度
result = max(now, result);
}
}
if (a > b && flag == -1) flag = k;//b>a,無貢獻
}
else {
if (!z.size()) return -1;//多E,編譯錯誤
k = z.top();
z.pop();
ins[k] = 0;
if (flag == k) flag = -1;
if (con[k]) {
con[k] = 0;
now--;
}
}
}
if (z.size()) return -1;
return result;
}
int main() {
scanf("%d", &T);
for (; T; T--) {
scanf("%d ", &N);
getline(cin, o);
ans1 = geto();
for (int i = 1; i <= N; i++)
getline(cin, code[i]);
ans2 = check();
if (ans2 == -1) puts("ERR");
else {
if (ans1 == ans2) puts("Yes");
else puts("No");
}
}
}