[NOIp 2017] 时间复杂度
洛谷 3952
输入一整行字符串时,如果中间有空格,则不能用 scanf("%s",...)
来输入!
scanf()
会在空格处停下!
在NOIp2018 前夕终于做出了NOIp2017的题
Candy? 说这道题用栈做,其实完全可以不用栈我不会,于是用一个比较笨拙的方法:找出与每个F
配对的E
,然后从第一个循环开始处理。
利用循环结构处理并列的F
与E
,递归处理嵌套的F
与E
。
用一个集合记录变量的名字,当遇到一个新变量名字时,查询是否冲突,一个循环结束改后,及时删除这个变量名。
第一次提交时只有 37 分,输出中间结果发现 match
过程中出现问题。。。冥思苦想好久不得其解,往上一翻翻然醒悟:
match 数组应该开 MAXL=100+10 的大小,结果写成了int match[MAXN]
,只开了 20 。。。
写程序时一定要细心!!!不能再犯这种低级错误!!!
//Copyright(C)Corona.
//2018-10-29
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXL=100+10,MAXN=20;
char p[MAXL][MAXN];
int match[MAXL];
set var;
inline void scanf(char cache[],char End,int maxn) {
for(int i=0; i'9') {
if(str[i]=='^') f=1;
} else {
x=x*10+str[i]-'0';
}
} x*=f;
}
inline void Match(int L,int& err) {
memset(match,-1,sizeof(match));
for(int i=0; inum(to)) in_loop=0;
}
}
int inc=0;//初始化为O(1)
for(int i=start+1; i!=end; i++) {
if(p[i][0]=='F') {
inc=max(inc,solve(i,match[i],err));
i=match[i];
}
}
var.erase(name);
return in_loop==1?init+inc:0;
}
int main() {
int T;
cin>>T;
while(T--) {
int L;
cin>>L;
char his_ans[MAXN];
scanf(his_ans,'\n',MAXN);
int complexity,com=0;
scanf(complexity,his_ans);
int err=0,cnt=0;
for(int i=0; i