1. 程式人生 > >Krypton Factor UVA - 129 ACM題目————困難的串

Krypton Factor UVA - 129 ACM題目————困難的串

題目描述   

如果一個字串包含兩個相鄰的重複子串,則稱他是“容易的串”,其他串稱為"困難的串"。例如,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。待解決!