[Luogu] P3952 時間復雜度
阿新 • • 發佈:2018-03-07
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 時間復雜度