csuoj 1115: 最短的名字
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115
1115: 最短的名字
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 615 Solved: 234
[Submit][Status][Web Board]
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
HINT
Source
分析;
直接模拟字符串长度。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int main() 6 { 7 int i,j,k,t,n,m; 8 int tot; 9 string s[1005]; 10 int a[1005]; 11 cin>>t; 12 while(t--) 13 { 14 tot = 0; 15 memset(a,0,sizeof(a)); 16 cin>>k; 17 for(i=0;i<k;i++) 18 { 19 cin>>s[i]; 20 //a[i] = s[i].length(); 21 } 22 23 for(i=0;i<k;i++) 24 { 25 m = 1; 26 n = 1; 27 for(j=0;j<k;) 28 { 29 30 if(!a[i]&&i!=j&&s[i].substr(0,m) == s[j].substr(0,m)) 31 { 32 m++; 33 n = 0; 34 } 35 else 36 { 37 j++; 38 n = 1; 39 } 40 } 41 if(n) 42 { 43 tot += m; 44 a[i] = 1; 45 } 46 47 } 48 cout<<tot<<endl; 49 } 50 return 0; 51 }
悠游天地间 all rights reserved. © 2013 -- 1 << 64