题目大意:
给定若干个字符串,求出最少需要几个结点所构成的树能表示出所有字符串。
思路:
此题看似是字典树,实则是模拟。首先将字符串数组排序,然后比较此字符串和上一个字符串有几个相同的字符,剩下不相同的字符则要增加孩子结点,用ans来记录增加孩子节点的数量,最后加上根结点即可。
代码:
#include<bits/stdc++.h>
using namespace std;
string s[114514];
int ans;
int main(){
int sum=0;
while(cin>>s[++sum]){//输入
;
}
sum--;//记得字符串数量一定要减一,不然会错
sort(s+1,s+sum+1);//排序
ans+=s[1].size();//将第一个字符串的结点加入到树中,结点个数也就是增加此字符串的长度
for(int i=2;i<=sum;i++){//从2开始,防止越界
int j;//记录相同字符个数
for(j=0;j<s[i-1].size();j++){
if(s[i-1][j]!=s[i][j]){//不相等则结束循环
break;
}
}
ans+=s[i].size()-j;//增加结点个数
}
cout<<ans+1;//记得加上根结点!!!!!!!!!(别问我为什么这么激动,都是血与泪的教训啊)
return 0;//完结撒花!
}