Re: world final 賽記

看板ACMCLUB作者 (小光光)時間21年前 (2004/04/06 23:13), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/4 (看更多)
※ 引述《smartboy (小光光)》之銘言: : : 我猜應該是終止條件的英文解讀問題. : 事實上我沒明講, 是希望有人會去看看題目之類的 ;) : 在比賽時我就把題目讀了三四遍, 深怕漏掉什麼條件沒看到 : 比完賽我繼續拿 source code 反覆閱讀想看出問題在哪, : 也解釋給隊友聽. : 比完賽隔天睡前再讀一次, 覺得有句的英文意思我不太肯定. : Input for the last test case is followed by a line consisting of : letter X. : 比賽當時我覺得要一行剛好是 "X" 才結束. : 重看幾遍, 那 "AAAXAAA" 呢, "XXX" 呢 : 若問題真出在這裡, 真是太可惜了. 所以我還是希望在其他地方有 bug 只是我沒看出來 :P 以下附當時我寫的 code, 大家幫忙看看吧(印出來再 keyin 的, 大致上保持原樣) (第一次 time limit execeeded, 所以我加上一些 cut, 順便用 macro 降常數) 順帶一題, 這次大會有說, 不公布各題時限, 只知是合理的時間, judge solution 的執行時間乘上一個 constant factor 云云. gcc compile 參數只有 -lm, 沒加 optimize flags #include <stdio.h> #include <string.h> #include <stdlib.h> int m; #define PLUS(x) x++; if(x==m) x=0; #define SKIPSPACE(s,str) while(str[s]==0) { PLUS(s) } int skipspace(int s,char str[]) { while(str[s]==0) s=(s+1)%m; return s; } int next(int now,int k,char str[]) { SKIPSPACE(now,str); while(k--) { PLUS(now); //now=(now+1)%m; SKIPSPACE(now,str); } return now; } int getstr(int start,int k,int len,char str[],char output[]) { int i; int now=start; for(i=0;i<len;i++) { if(i==0) now=next(now,0,str); else now=next(now,k,str); output[i]=str[now]; str[now]=0; } output[i]=0; return 0; } int matstr(int start,int k,int len,char str[],char tomatch[]) { int i; int now=start; for(i=0;i<len;i++) { if(i==0) now=next(now,0,str); else now=next(now,k,str); if(tomatch[i]!=str[now]) return 0; str[now]=0; } return 1; } int main(void) { int z; char line[45]; char str[45]; char stra[45]; int casen=0; freopen("insecure.in","r",stdin); while(scanf("%s",line)==1 && strcmp(line,"X")) { int bestlen=0,bestans=0; char beststr[45]=""; char bak2[45]; int len; int s,i,t,j; char linecpy[45]; int count[256]={0}; strcpy(linecpy,line); m=strlen(line); for(z=0;z<m;z++) count[line[z]]++; for(len=m/2;len>0;len--) { int ans=0; for(s=0;s<m;s++) for(i=0;i<m;i++) { memset(str,0,sizeof(str)); strcpy(line,linecpy); getstr(s,i,len,line,stra); int bad=0; for(z=0;z<len;z++) { count[stra[z]]-=2; if(count[stra[z]]<0) bad=1; } for(z=0;z<len;z++) { count[stra[z]]+=2; } if(bad) continue; memcpy(bak2,line,sizeof(line)); int found=0; for(t=0;t<m;t++) { for(j=m;j>i;j--) { memcpy(line,bak2,sizeof(line)); if(matstr(t,j,len,line,stra)) { found=1; ans++; if(bestlen==len) { if(strcmp(beststr,stra)!=0) bestans++; } else { bestlen=len; bestans=1; strcpy(beststr,stra); } } if(found) break; } if(found) break; } } if(bestans) break; } casen++; if(bestans>1) printf("Code %d: Codeword not unique\n",casen); else printf("Code %d: %s\n",casen,beststr); } return 0; } -- "靈感 = 經驗 + 嘗試 + 快速的計算能力" --- Ledia "靈感, 是實力的累積" --- untitled -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.82 ※ 編輯: smartboy 來自: 140.112.30.82 (04/06 15:27)
文章代碼(AID): #10SiamFY (ACMCLUB)
文章代碼(AID): #10SiamFY (ACMCLUB)