1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4 char data[11][101];
5 int len[11];
6 int addlen[11][11];
7 int minnum;
8 int used[11];
9 void add(int x,int y);
10 void dfs(int pre,int step,int sum,int num);
11 int main()
12 {
13 /*freopen("in.txt","r",stdin);*/
14 int n,m;
15 cin >>n;
16 for(int i=0;i<n;i++)
17 {
18 minnum=10000;
19 cin >>m;
20 for(int j=0;j<m;j++)
21 {
22 cin >>data[j];
23 len[j]=strlen(data[j]);
24 used[j]=0;
25 }
26 for(int j=0;j<m;j++)
27 for(int k=0;k<m;k++)
28 add(j,k);
29 for(int j=0;j<m;j++)
30 {
31 used[j]=1;
32 dfs(j,1,len[j],m);
33 used[j]=0;
34 }
35 cout <<minnum<<endl;
36
37
38 }
39 return 0;
40 }
41 void dfs(int pre,int step,int sum,int num)
42 {
43 if(sum>=minnum) return;
44 if(step==num)
45 {
46 if(sum<minnum)
47 minnum=sum;
48 return;
49 }
50 for(int i=0;i<num;i++)
51 {
52 if(used[i]==0)
53 {
54 used[i]=1;
55 dfs(i,step+1,sum+addlen[pre][i],num);
56 used[i]=0;
57 }
58 }
59 }
60
61
62
63
64 void add(int x,int y)
65 {
66 int length=0;
67 for(int i=1;i<=len[x]&&i<=len[y];i++)
68 {
69 bool flag=true;
70 for(int j=len[x]-i,k=0;k<i;k++,j++)
71 {
72 if(data[x][j]!=data[y][k])
73 {
74 flag=false;
75 break;
76 }
77 }
78 if(flag)
79 length=i;
80 }
81 //cout <<length<<" ";
82 addlen[x][y]=len[y]-length;
83 }
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4 char data[11][101];
5 int len[11];
6 int addlen[11][11];
7 int minnum;
8 int used[11];
9 void add(int x,int y);
10 void dfs(int pre,int step,int sum,int num);
11 int main()
12 {
13 /*freopen("in.txt","r",stdin);*/
14 int n,m;
15 cin >>n;
16 for(int i=0;i<n;i++)
17 {
18 minnum=10000;
19 cin >>m;
20 for(int j=0;j<m;j++)
21 {
22 cin >>data[j];
23 len[j]=strlen(data[j]);
24 used[j]=0;
25 }
26 for(int j=0;j<m;j++)
27 for(int k=0;k<m;k++)
28 add(j,k);
29 for(int j=0;j<m;j++)
30 {
31 used[j]=1;
32 dfs(j,1,len[j],m);
33 used[j]=0;
34 }
35 cout <<minnum<<endl;
36
37
38 }
39 return 0;
40 }
41 void dfs(int pre,int step,int sum,int num)
42 {
43 if(sum>=minnum) return;
44 if(step==num)
45 {
46 if(sum<minnum)
47 minnum=sum;
48 return;
49 }
50 for(int i=0;i<num;i++)
51 {
52 if(used[i]==0)
53 {
54 used[i]=1;
55 dfs(i,step+1,sum+addlen[pre][i],num);
56 used[i]=0;
57 }
58 }
59 }
60
61
62
63
64 void add(int x,int y)
65 {
66 int length=0;
67 for(int i=1;i<=len[x]&&i<=len[y];i++)
68 {
69 bool flag=true;
70 for(int j=len[x]-i,k=0;k<i;k++,j++)
71 {
72 if(data[x][j]!=data[y][k])
73 {
74 flag=false;
75 break;
76 }
77 }
78 if(flag)
79 length=i;
80 }
81 //cout <<length<<" ";
82 addlen[x][y]=len[y]-length;
83 }