描述:以第一个字符串为贪心对象,在其他字符串中寻找一个与此字符串从字符串下标开始匹配最多的字符串,如果在匹配过程中存在不相符的,那么前面这些匹配成功的就不需要再次不输入,也就是说这些部分在press时就不需要了,只需要press以后不匹配的就可以了,然后在意这个字符串为贪心对象,以此类推即可
#include <cstdio>
#include <cstdlib>
#include <cstring>
int cmp(const void *p1,const void *p2)
{
return strcmp((char *)p1,(char *)p2);
}
char str[110][110];
int num[110];
int main()
{
// freopen("a.txt","r",stdin);
int n,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0; i<n; i++) scanf("%s",str[i]);
char s[110];
strcpy(s,str[0]);
qsort(str,n,sizeof(str[0]),cmp);
memset(num,-1,sizeof(num));
int i=0,sum=strlen(s),j,count=1;
for(i=0; i<n; i++) if(strcmp(s,str[i])==0) break;
num[0]=i;
j=i-1;
i++;
while(1)
{
int c=-1,d=-1;
if(j>=0)
{
int left=strlen(str[j]),k;
for( k=0; k<left; k++)
if(str[j][k]!=s[k]) break;
c=k;
}
if(i<n)
{
int left=strlen(str[i]),k;
for( k=0; k<left; k++)
if(str[i][k]!=s[k]) break;
d=k;
}
if(c!=-1&&c>=d)
{
num[count++]=j;
sum+=strlen(str[j])-c;
strcpy(s,str[j]);
j--;
}
else if(d!=-1&&d>c)
{
num[count++]=i;
sum+=strlen(str[i])-d;
strcpy(s,str[i]);
i++;
}
if(j==-1&&i==n) break;
}
printf("%d\n",sum);
for(i=0; i<count; i++) printf("%s\n",str[num[i]]);
}
return 0;
}
08-07
08-07
08-07