Krypton Factor UVA - 129 ACM題目————困難的串
阿新 • • 發佈:2018-11-17
題目描述
如果一個字串包含兩個相鄰的重複子串,則稱他是“容易的串”,其他串稱為"困難的串"。例如,BB,ABCDACABCAB,ABCDABCD都是容易的串,而D,DC,ABDAB,CBABCBAD都是困難的串。
輸入
輸入正整數n和L。
輸出
輸出由前L個字串組成的,字典序第k小的困難的串。例如,當L=3時,前7個困難的串分別為A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA。輸入保證答案不超過80個字元。
樣例輸入
7 3 30 3
樣例輸出
ABACABA ABACABCACBABCABACABCACBACABA
#include<cstdio> #include<algorithm> #include<ctime> #include<iostream> #include<cmath> using namespace std; char mylist[2000]; int L, n; char alb[28]; int icount=0; bool isfinised=false; bool check(int cur) { char c=mylist[cur]; int s=-1,i; for(s=cur-1;s>-1;s--) if(c==mylist[s]) { if(s==-1) return true; int l=cur-s; if(l==1) return false; for(i=1;i<l&&s-i>-1;i++) if(mylist[cur-i]!=mylist[s-i]) break; if(i==l) return false; if(s-i==-1) return true; } } void dfs(int cur) { if(isfinised) return; if(icount==L) { int k=1; for(int i=0;i<cur;i++) { cout<<mylist[i]; if((k)%68==0) cout<<endl; else if((k)%4==0) cout<<" "; k++; } if((k-1)%68!=0)cout<<endl; cout<<cur<<endl; isfinised=true; return; } for(int i=0;i<n;i++) { char c=alb[i]; mylist[cur]=c; if(check(cur)) { icount++; dfs(cur+1); }; } } int main() { for(int i=0;i<26;i++) alb[i]='A'+i; while(true) { icount=0; isfinised=false; cin>>L;cin>>n; if(n==0&&L==0) break; dfs(0); if(icount<L) cout<<0<<endl; }; }
這段程式思路正確,所有的測試案例通過,但是在vjudge上執行的時候顯示runtime error。待解決!