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。待解决!

猜你喜欢

转载自blog.csdn.net/qiang_____0712/article/details/84057356
129
今日推荐