1115: 最短的名字
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 483 Solved: 177
[ Submit][ Status][ Web Board]
Description
Input
Output
对于每组数据,输出所有人名字的字母总数。
Sample Input
1
3
aaaaa
bbb
abababab
Sample Output
5
HINT
Source
分析:
暴力题。先按字典序对所有名字进行排序。然后从前往后两两比较,每次都能得到一个人名字的前缀。最后把所有前缀加和就是答案了。
ac代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int i,j,T,n,k,ans;
int cnt[1005];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0;
vector<string> vec;
string str;
memset(cnt,0,sizeof(cnt));
for(i=0;i<n;i++)
{
cin>>str;
vec.push_back(str);
}
sort(vec.begin(),vec.end());
for(i=0;i<n-1;i++) //任何一个人的名字都不是其他人名字的前缀
{
for(j=0;j<vec[i].size()&&j<vec[i+1].size()&&vec[i][j]==vec[i+1][j];j++);
if(j+1>cnt[i])//前J个字母相同
cnt[i]=j+1;
// if(j+1>cnt[i+1]) //这句话可以不要,因为是往后递推
cnt[i+1]=j+1;
}
for(ans=i=0;i<n;i++)
ans+=cnt[i];
printf("%d\n",ans);
}
return 0;
}