10602 - Editor Nottoobad

描述:以第一个字符串为贪心对象,在其他字符串中寻找一个与此字符串从字符串下标开始匹配最多的字符串,如果在匹配过程中存在不相符的,那么前面这些匹配成功的就不需要再次不输入,也就是说这些部分在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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值