1. 程式人生 > >【模擬】洛谷_3952 時間複雜度

【模擬】洛谷_3952 時間複雜度

題意

給出幾個語句,判斷它們的時間複雜度是否符合,如果是的話輸出‘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"); } } }