• E


    Description

    在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab。
    名字这么长,叫全名显然起来很不方便。所以村民之间一般只叫名字的前缀。比如叫'aaaaa'的时候可以只叫'aaa',因为没有第二个人名字的前三个字母是'aaa'。不过你不能叫'a',因为有两个人的名字都以'a'开头。村里的人都很聪明,他们总是用最短的称呼叫人。输入保证村里不会有一个人的名字是另外一个人名字的前缀(作为推论,任意两个人的名字都不会相同)。
    如果村里的某个人要叫所有人的名字(包括他自己),他一共会说多少个字母?

    Input

    输入第一行为数据组数T (T<=10)。每组数据第一行为一个整数n(1<=n<=1000),即村里的人数。以下n行每行为一个人的名字(仅有小写字母组成)。输入保证一个村里所有人名字的长度之和不超过1,000,000。
     

    Output

    对于每组数据,输出所有人名字的字母总数。

    Sample Input

    1
    3
    aaaaa
    bbb
    abababab 

    Sample Output

    5 



     1 #include"iostream"
     2 #include"algorithm"
     3 #include"vector"
     4 #include"cstdio"
     5 #include"cstring"
     6 using namespace std;
     7 int main()
     8 {
     9     int i,j,T,n,k,ans;
    10     int cnt[1005];
    11     scanf("%d",&T);
    12     while(T--)
    13     {
    14         scanf("%d",&n);
    15         vector<string> vec;
    16         string str;
    17         memset(cnt,0,sizeof(cnt));
    18         for(i=0;i<n;i++)
    19         {
    20             cin>>str;
    21             vec.push_back(str);
    22         }
    23         sort(vec.begin(),vec.end());
    24         for(i=0;i<n-1;i++)     //任何一个人的名字都不是其他人名字的前缀 
    25         {
    26             for(j=0;j<vec[i].size()&&j<vec[i+1].size()&&vec[i][j]==vec[i+1][j];j++);
    27             if(j+1>cnt[i])
    28                 cnt[i]=j+1;
    29             if(j+1>cnt[i+1])   //前J个字母相同 
    30                 cnt[i+1]=j+1;
    31         }
    32         for(ans=i=0;i<n;i++)
    33             ans+=cnt[i];
    34         printf("%d
    ",ans); 
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    svn 更新
    首尾渐变
    sublime常用快捷键
    【CSS3】transition过渡和animation动画
    JS实现奇偶数的判断
    style、currentStyle、getComputedStyle区别介绍
    JavaScript中判断对象类型的种种方法
    CSS3 animation动画,循环间的延时执行时间
    EMCA创建em资料库时报错
    OS Kernel Parameter.semopm
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4008614.html
Copyright © 2020-2023  润新知