hdu1560 搜索

从原串的最大长度开始枚举,当某个长度的值能保存所有串时,即成功。对每个长度进行深搜,每次取某个串的第一个。

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<map>

using namespace std;

char str[8][6];

int flag=0,len[10],n;

int getlen(int *a)

{

    int i,ans=0;

    for(i=0;i<n;i++)

        ans=max(ans,a[i]);

    return ans;

}

void IDA(int *l,int nowlen)

{

    int i,j;

    if(flag)//找到了,便不用再往下找

        return ;

    if(getlen(l)>nowlen)//剩下的串中最短的串比预计长度要长

        return ;

    if(nowlen==0)//找到,进行标记

    {

        flag=1;

        return ;

    }

    int vi[10];

    memset(vi,0,sizeof(vi));

    for(i=0;i<n;i++)

    {

        if(!vi[i]&&l[i])//没有取出剩下串的首字符

        {

            int temp[10];

            for(j=0;j<n;j++)

                temp[j]=l[j];

            vi[i]=1;

            char ch=str[i][len[i]-l[i]];

            temp[i]--;

            for(j=i+1;j<n;j++)

            {

                if(str[j][len[j]-l[j]]==ch&&!vi[j]&&l[j])

                {

                    vi[j]=1;

                    temp[j]--;

                }

            }

            IDA(temp,nowlen-1);

        }

    }

    return ;

}

int main()

{

    int i,j,t,low;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%d",&n);

        low=0;

        for(i=0;i<n;i++)

        {

            scanf("%s",&str[i]);

            len[i]=strlen(str[i]);

            low=max(low,len[i]);

        }

        flag=0;

        while(1)

        {

            IDA(len,low);

            if(flag)

            {

                printf("%d\n",low);

                break;

            }

            low++;

        }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)