2 条题解
-
1
#include<cstdio> #include<stack> #include<string> #include<iostream> #include<algorithm> using namespace std; const int maxl=105; int t,l,w; string o; string code[maxl]; int sread(int &x,string c) { int res=0; int len=c.size(); while(c[x]<'0' || c[x]>'9'&&x<c.size()) { if(c[x]=='n'){ ++x; return 1000000; } ++x; } while(c[x]>='0' && c[x]<='9') { res*=10;res+=c[x]-'0'; ++x; } return res; } int geto() { int res=0,x=3; int len=o.size(); if(o[2]=='n') res=sread(x,o); else res=0; return res; } int check() { int res=0,now=0; int a,b,x; stack<int> s; int flag=-1; bool ins[26]={0}; bool ef[26]={0}; for(int i=1;i<=l;i++) { if(code[i][0]=='F') { int k=code[i][2]-'a'; if(ins[k]) return -1; s.push(k);ins[k]=true; x=4; a=sread(x,code[i]);b=sread(x,code[i]); //printf("a:%d b:%d\n",a,b); if(b-a>1000) { //cout<<"##"<<(char)(k+'a')<<"##"<<endl; if(flag==-1) { now++; res=max(res,now); ef[k]=true; } } if(a>b) { if(flag==-1) flag=k; } } if(code[i][0]=='E') { if(s.empty()) return -1; int k=s.top(); s.pop();ins[k]=false; if(flag==k) flag=-1; if(ef[k]) { ef[k]=false; now--; } } } if(s.size()) return -1; return res; } int main() { //freopen("s.txt","w",stdout); scanf("%d",&t); while(t--) { int ww; scanf("%d ",&l); getline(cin,o); w=geto(); //printf("w:%d\n",w); for(int i=1;i<=l;i++) getline(cin,code[i]); //for(int i=1;i<=l;i++) cout<<code[i]<<"###\n"; ww=check(); //printf("ww:%d\n",ww); //cout<<o<<"##\n"; if(ww==-1) puts("ERR"); else { if(ww==w) puts("Yes"); else puts("No"); } } }
-
-2
//时间复杂度 #include<bits/stdc++.h> using namespace std; const int inf=0x7fffffff; int t,l; int getVal( ) { int tmp=0; string si; stringstream so; //字符串流,可以转类型 cin>>si; if(si[0]=='n') return inf; //n返回极大值inf else {//常数则返回实际值 so<<si; //把字符串输入流 so>>tmp; //把流输出到对应类型,完成类型转换 } return tmp; } void getAns( ) { char fe,sn[101]={'#'}; //栈底用'#'填充 bool bc=0; //判断是否为n^w次方,区分【O(1)和O(n^1)】 map<string,int> mp; //变量判重 //朱天宇同学建议用Hash法,char vis[26],进行变量判重很好的 int tf=1,tn=0,mw=0,flag=0,w=0,x,y; string val; scanf("%d",&l); cin>>val; for(int i=0;val[i]!=')';++i) {//取复杂度指数w if(val[i]=='^') bc=1; if(val[i]>'9' || val[i]<'0') continue; w=w*10+val[i]-'0'; } for(int i=0;i<l;++i) { if(flag<10) {//语法错误,复杂度统计出错,会修改标记flag为10 cin>>fe; if(fe=='F') {//行首字符判定,'F'入栈,'E'出栈 tf++; //入栈 cin>>val; //读入循环控制变量 if(mp.count(val)==0) //变量判重 mp[val]=1; //不冲突存入map,备查 else flag=10; //冲突修改标记 x=getVal(); //读入循环左边界 y=getVal(); //读入循环有边界 if(x<y) {//可以循环多次 if(y==inf) {//y为n,此轮为n次循环 if(sn[tf-2]!='0') {//上一次为正常循环,标记为n sn[tf-1]='n'; tn++; //实际循环指数增加 mw=max(mw,tn); //求最大实际循环指数 } else //上一轮循环不正常,此轮继续无效 sn[tf-1]='0'; } else if(sn[tf-2]=='0') //上一轮循环不正常,此轮继续无效 sn[tf-1]='0'; else //此轮为常数次循环,正常标记为1 sn[tf-1]='1'; } else if(x==y) //此轮为常数次循环,正常标记为1 sn[tf-1]='1'; else //x>y,非正常循环,标记为0 sn[tf-1]='0'; } else { tf--; //出栈 if(sn[tf]=='n') //n出栈,循环指数要减小 tn--; if(tf==1) mp.clear( ); //栈为空,清空变量判重map } getchar(); //过滤行末换行符 } else {//已经确定出错,结果为ERR,剩下的行,直接按行读取,不加判断 getline(cin,val); } } if(tf!=1) flag=10; //栈不空,F-E不配对出错 if(bc==0 && mw==0) mw=1; //常数次循环,校正mw if(flag==10) puts("ERR"); //错误 else { if(w==mw) puts("Yes"); else puts("No"); } } int main( ) { scanf("%d",&t); while(t--) { getAns(); } return 0; } /* 自造测试数据,是一种编程技能。超大数据时难以调试的 ** 况且有时候,特殊刁钻数据不会给出,得自己想到 15 6 O(1) F i n 10 F j 2 100 F k 5 n E E E 6 O(n^1) F i 10 n F j n 2 F i 5 n E E E 6 O(n^1) F i 10 n F j n 2 E E F i 5 n E */
- 1
信息
- ID
- 72
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 21
- 已通过
- 5
- 上传者