题目描述
如果一个字符串包含两个相邻的重复子串,则称他是“容易的串”,其他串称为"困难的串"。例如,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。待解决!