Hướng dẫn giải của Kiểm tra chương trình
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
const fi=''; fo=''; maxn=50000; var n,re,v:longint; a,d:array[0..maxn] of longint; procedure rf; var s:string; l:longint; begin n:=0; d[0]:=0; readln(s); l:=length(s); while l<7 do begin if l>1 then begin inc(n); a[n]:=l shr 1; d[n]:=d[n-1]; if odd(a[n]) then d[n]:=d[n]+2-a[n]; end; readln(s); l:=length(s); end; end; function calc(l,r:longint;var u:longint):longint; var k,i,j,re,t,v:longint; begin u:=0; if l+1>=r then begin calc:=1; if (a[l]=1) and (a[r]=3) then u:=0 else u:=1; exit; end; for k:=l+1 to r-1 do if (a[k]=2) and (d[k]=d[l]) then begin calc:=calc(l,k,v)+calc(k,r,v); u:=1; exit; end; re:=1; i:=l+1; while i<r do begin for j:=i+1 to r-1 do if (a[j]=3) and (d[j]=d[i]-1) then break; t:=calc(i,j,v); re:=re*(t+1-v); i:=j+1; end; calc:=re; end; procedure wf; var re,i,j,t,z:longint; begin i:=1; re:=1; while i<n do begin for j:=i+1 to n do if (a[j]=3) and (d[j]=d[i]-1) then break; t:=calc(i,j,z); re:=re*(t+1-z); i:=j+1; end; writeln(re); end; begin assign(input,fi); reset(input); assign(output,fo); rewrite(output); rf; wf; close(input); close(output); end.
Code mẫu của RR
{$R+,Q+} PROGRAM NKTEST; CONST FINP=''; FOUT=''; max=50000; VAR kq:longint; count:array[0..max,1..2] of longint; n:array[0..max] of byte; ok:array[1..max] of boolean; procedure writeOutput; var f:text; begin assign(f,FOUT); rewrite(f); writeln(f,count[0,1]); close(f); end; procedure readInput; var f:text; s:string; level:longint; begin kq:=1; assign(f,FINP); reset(f); level:=0; count[0,1]:=1; n[0]:=1; repeat readln(f,s); if s='IF' then begin inc(level); n[level]:=1; ok[level]:=false; count[level,1]:=1; count[level,2]:=1; end else if s='ELSE' then begin inc(n[level]); end else if s='END_IF' then begin dec(level); count[level,n[level]]:=count[level,n[level]]*(count[level+1,1]+count[level+1,2]); end; until s='ENDPROGRAM'; close(f); end; BEGIN readInput; writeOutput; END.
Code mẫu của skyvn97
#include<cstdio> #include<iostream> #include<string> using namespace std; typedef long long ll; inline string nextstring(void) { string s; cin>>s; return s; } ll steps(const string &END="END_IF") { ll bef=1; ll aft=1; bool ELSE=false; while (true) { string s=nextstring(); if (s=="S") continue; if (s==END) return (bef+aft-(END!="END_IF")); if (s=="ELSE") ELSE=true; if (s=="IF") { if (ELSE) aft*=steps(); else bef*=steps(); } } } int main(void) { ios::sync_with_stdio(false); cout<<steps("ENDPROGRAM"); return 0; }
Code mẫu của khuc_tuan
#include <iostream> using namespace std; int a[1000000]; int n; int calc(int l, int r) { if(l>r) return 1; int dem = 0, el = -1, en = -1; for(int i=l;i<=r;++i) { if(a[i]==1) ++dem; else if(a[i]==3) --dem; if(dem==1 && a[i]==2) el = i; if(dem==0 && a[i]==3) { en = i; break; } } int res = calc( en+1, r); int dau = 0; if(el==-1) dau += 1 + calc(l+1, en-1); else dau += calc(l+1, el-1) + calc(el+1,en-1); return res * dau; } int main() { char buf[100]; while(gets(buf)) { if(strcmp(buf,"ENDPROGRAM")==0) break; else if(strcmp(buf,"IF")==0) a[n++] = 1; else if(strcmp(buf,"ELSE")==0) a[n++] = 2; else if(strcmp(buf,"END_IF")==0) a[n++] = 3; } // for(int i=0;i<n;++i) cout << a[i] << " " ; cout << endl; int res = calc(0,n-1); cout << res << endl; // system("pause"); return 0; }
Bình luận