最短的名

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 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1010][1010];

typedef  struct node
  {
   node *child[26];
   int n;     
  }node;
  
void Tree(node *root,char *str)//建樹 
{
  int len=strlen(str),i,j;
  node *ans=root;
  for(i=0;i<len;i++)
  {
   if(ans->child[str[i]-'a']==NULL)
   {
     node *p=(node*)malloc(sizeof(node));                                
     p->n=1;
     for(j=0;j<26;j++)
      p->child[j]=NULL;
      ans->child[str[i]-'a']=p;
      ans=p;
    }                 
   else 
   {
    ans=ans->child[str[i]-'a'];
    ans->n++;     
   }                             
  }  
}
int Locate(node *root)  //查找      
  {
    node *ans=root;
    int sum1=0,i;
    for(i=0;i<26;i++)
     {
       if(root->child[i]!=NULL)
       {
         ans=root->child[i];
         sum1+=ans->n;
         if(ans->n>1) sum1+=Locate(ans);                        
       }                
     }
  return sum1;
  }
void Free(node *root)//釋放 
{
  int i;
  for(i=0;i<26;i++)
  {
   if(root->child[i]!=NULL)
   Free(root->child[i]);   
  }
  delete(root);
}
int main()
{
  int T,n,sum,i;
  scanf("%d",&T);
  while(T--)
  {
    node *root=(node*)malloc(sizeof(node));
    root->n=0;   
   for(i=0;i<26;i++)
       root->child[i]=NULL;        
   scanf("%d\n",&n);
   for(i=0;i<n;i++)
   {
   gets(s[i]);
    Tree(root,s[i]);
   } 
   sum=Locate(root);
   printf("%d\n",sum);
   Free(root);
  }   
return 0;
}





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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章