点击打开链接
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define bug(x) printf("***%d\n",x)
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
string s[20];//主要就是利用string的简便性 ,str.substr(pos,len)
int n;
int solve(){
string ans=s[0];
for(int i=1;i<n;i++){
int l=min(ans.size(),s[i].size());
for(int j=l;j>=0;j--){
if(ans.substr(ans.size()-j,j)==s[i].substr(0,j)){//输入起始位置和长度
ans+=s[i].substr(j,s[i].size()-j);
break;
}
}
}
return ans.size();
}
int main()
{
int T;
cin>>T;
int cnt=1;
while(T--){
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
int ans=inf;
sort(s,s+n);//把它的序列搞成最小的
do{
ans=min(ans,solve());
}while(next_permutation(s,s+n));
printf("Case %d: %d\n",cnt++,ans);
}
return 0;
}
/*
2
3
ABCD
DEFGH
CDEF
2
AAAAA
AAAAAAA
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
/*
substring buhuia
*/
struct Str{
int len;
char s[110];
}str[110];
int val[10];
int n, T;
Str st;
int check(int l,int pos){
for(int i=0;i<l;i++){
if(str[pos].s[i]!=st.s[st.len-l+i])
return 0;
}
return 1;
}
int solve(){
int now=val[1];
st.len=str[now].len;
//printf("***st.len:%d\n",st.len);
strcpy(st.s,str[now].s);
for(int i=2;i<=n;i++){
now=val[i];
int max_len=min(st.len,str[now].len);
int flag=0;
for(int k=max_len;k>=1;k--){
if(check(k,now)){
flag=1;
for(int j=0;j<str[now].len-k;j++){
st.s[st.len+j]=str[now].s[k+j];
}
st.len=st.len+str[now].len-k;
//printf("k:%d st.len:%d\n",k,st.len);
break;
}
}
if(!flag){
for(int j=0;j<str[now].len;j++){
st.s[st.len+j]=str[now].s[j];
}
st.len+=str[now].len;
}
//printf("i:%d len:%d\n",i,st.len);
}
/*
for(int i=0;i<st.len;i++)
putchar(st.s[i]);
printf("\n");
*/
return st.len;
}
/*
2
3
ABCD
DEFGH
CDEF
2
AAAAA
AAAAAAA
*/
int main(){
scanf("%d",&T);
for(int kase=1;kase<=T;kase++){
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++){
scanf(" %s",str[i].s);
int len=strlen(str[i].s);
str[i].len=len;
sum+=len;
val[i]=i;
}
do{
/*
for(int i=1;i<=n;i++){
if(i==1) printf("%d",val[1]);
else printf(" %d",val[i]);
}
printf("\n");
*/
int tmp=solve();
sum=min(sum,tmp);
}while(next_permutation(val+1,val+n+1));
printf("Case %d: %d\n",kase,sum);
}
return 0;
}