小白书之困难的串回溯

来源:互联网 发布:淘宝飞利浦官方旗舰店 编辑:程序博客网 时间:2024/05/21 04:43

如果一个字符串包含俩个相邻的重复子串,则称它是“容易的串”,其他串称为"困难的串“,输入正整数N和L,输出

由前L个字符组成的,字典序第k小的困难的串。

我们只需要判断当前串的后缀,而非所有的子串是否满足条件即可.

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#include<ctime>#include<algorithm>#include<climits>#define LL long longusing namespace std;const int maxn=101;int S[maxn];int L,N;int cnt;int dfs(int cur){    if(cnt++==N)    {        for(int i=0;i<cur;i++)            printf("%c",S[i]+'A');        cout<<endl;        return 0;    }    for(int i=0;i<L;i++)    {        S[cur]=i;        int ok=1;        for(int j=1;j*2<=cur+1;j++)        {            int equal=1;            for(int k=0;k<j;k++)                if(S[cur-k]!=S[cur-k-j])            {                equal=0;                break;            }            if(equal) {ok=0;break;}        }        if(ok) if(!dfs(cur+1)) return 0;    }    return 1;}int main(){    while(cin>>N)    {        cin>>L;        cnt=0;        dfs(0);    }}



0 0