UVA 10602 EDITOR NOTTOOBAD

来源:互联网 发布:sql insert into 日期 编辑:程序博客网 时间:2024/06/05 03:48
#include <map>#include <set>#include <list>#include <cmath>#include<cctype>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cstdio>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b){return a % b == 0 ? b : gcd(b, a % b);}//这里学习了一下d_double的代码,以编号来排序生成,主要思路就是last与i的查找,每次找到以last为最大前缀的i#define MAXN 120struct node{    char input[MAXN];    int id;    friend bool operator <(const node &a,const node &b)    {        return a.id<b.id;    }}src[MAXN];int main(){    int T;    scanf("%d",&T);    while (T--)    {        int N;        scanf("%d",&N);        for (int i=0;i<N;i++)        {            scanf("%s",src[i].input);            src[i].id=-1;//-1表示最开始还没有应用        }        src[0].id=0;        int ans=strlen(src[0].input);        int leap=1,last=0;//每次为last找到最大前缀        while (leap<N)        {            int cnt=0,t=-1;//计数找到最大匹配,            for (int i=0;i<N;i++)                if (src[i].id==-1)//当前字串未运算,下面对i字串进行运算                {                    if (t==-1)                    {                        t=i;                        if (src[i].input[0]==src[last].input[0])                        {                            for (int j=0;j<strlen(src[i].input)&&j<strlen(src[last].input);j++)                              {                                  if(src[last].input[j]!=src[i].input[j]) break;                                  else cnt++;                              }                        }                    }                    else                    {                        int tmp=0;                        for (int j=0;j<strlen(src[last].input) && j<strlen(src[i].input);j++)                        {                        if (src[last].input[j]!=src[i].input[j])break;                        else tmp++;                        }                        if (tmp>cnt) {t=i;cnt=tmp;}//最大匹配前缀                    }                }                ans+=(strlen(src[t].input)-cnt);                    src[t].id=leap++;                    last=t;       }       sort(src,src+N);       printf("%d\n", ans);        for(int i=0; i<N; ++i)            puts(src[i].input);    }    return 0;}

0 0
原创粉丝点击