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; }