1. 程式人生 > >[Luogu] P3952 時間復雜度

[Luogu] P3952 時間復雜度

markdown line cout OS else cin body 代碼 ble

Luogu P3952 時間復雜度


傳送門

這個題,他又是一個大模擬。考場依然爆炸,我怎麽那麽水啊

#include <cstdio>
#include <iostream>
#include <cctype>
#include <string>
using namespace std;
int t, l, flr, stp, gvn, rlt, mrlt;
int vis[26], noin[101], inc[101];
char var[101];
string s, ss;
inline int get_int(string ss) {         //本函數讀入字符串中的數字
if(ss[0] == 'n') return (0x7f); int x = 0, lent = int(ss.size()); for (int i = 0; i < lent; ++i) if(isdigit(ss[i])) x = x * 10 + ss[i] - '0'; return x; } inline void rest(int now, bool fl) { //讀入錯誤跳出後,該段代碼剩余的部分 if(fl) { cin >> s >> ss; } for
(int i = now; i <= l; ++i) { cin >> s; if(s == "F") { cin >> s; cin >> s >> ss; } } return ; } void solve() { flr = rlt = mrlt = 0; cin >> l >> s; //讀入行數與預先判斷的復雜度 if(int(s.find("n^")) != -1
) gvn = get_int(s); //處理復雜度,若是常數以0代替 else gvn = 0; for (int i = 1; i <= l; ++i) { cin >> s; if(s == "F") { //若首字母為循環開始的標誌 flr++; //加循環層數 cin >> s; //讀入變量名 if(vis[s[0] - 'a'] == stp) { //如果之前變量已經被用過 cout << "ERR\n"; rest(i + 1, true); return ; //錯誤,跳出 } vis[s[0] - 'a'] = stp; //將變量標識為已使用 var[flr] = s[0]; //存儲該層變量名 if(noin[flr - 1] == stp) noin[flr] = stp; //如果上層未進入,標識該層亦未進入 cin >> s >> ss; //讀入開始值與結束值 if(s != ss && !isdigit(ss[0]) && flr > rlt && noin[flr] != stp) { rlt++; inc[flr] = stp; mrlt = mrlt < rlt ? rlt : mrlt; } //如果x != y, y = n, 循環層數大於當前最大復雜度, 並且該層可以進入,即使當前最大復雜度加1, 標記該層增加了復雜度, 更新全局最大復雜度的值。 if(s != ss && ((!isdigit(s[0]) && isdigit(ss[0])) || get_int(s) > get_int(ss))) noin[flr] = stp; //如果X != y, 並且x為數字, y = n, 或兩者均為數字但x < y的話, 標記該層無法進入。 } if(s == "E") { //若首字母是循環結束的標誌 if(flr - 1 < 0) { //如果層數減一小於零, 即'E'比'F'多 cout << "ERR\n"; rest(i + 1, false); return ; //錯誤,跳出 } vis[var[flr] - 'a']--; //當前循環層所用的變量銷毀 noin[flr]--; //該層的無法進入標記去掉 if(inc[flr] == stp) { //如果該層增加過復雜度,那麽退回 inc[flr]--; rlt--; } flr--; //層數減一 } } if(flr != 0) { //如果處理到最後,層數不等於一,即'F'比'E'多 cout << "ERR\n"; return ; //錯誤,跳出 } if(gvn == mrlt) {cout << "Yes\n";} //如果實際復雜度等於給定復雜度,輸出"Yes" else cout << "No\n"; //否則輸出"No" return ; } int main() { cin >> t; while(t--) { stp++; solve(); } return 0; }

[Luogu] P3952 時間復雜度