1
3
aaaaa
bbb
abababa
Sample Output
5
<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=1000005;
int tree[MAXN][26];
int num[MAXN];//记录每个节点到达的次数
char s[MAXN];
int m=0;
int ans;
void build(int rt,char s[])
{
num[rt]++;
for(int i=0;s[i];i++)//字符串最后面的'/0'其实就是0
{
if(!tree[rt][s[i]-'a'])
{
tree[rt][s[i]-'a']=++m;//给每个未出现的点加编号
rt=m;
memset(tree[rt],0,sizeof(tree[rt]));//这里其实是一个优化,这是去除上次操作里面存留的东西,不然每次都要memset整个数组,数据太大就容易tle
num[rt]=0;//同理
}
else
rt=tree[rt][s[i]-'a'];
num[rt]++;//记录节点到达次数
}
}
/*void build(int rt,char s[])
{
num[rt]++;//这就是未优化的,这样写的话,主函数每次都要把tree,num数组全部归为0,浪费时间
for(i=0;s[i];i++)
{
if(!tree[rt][s[i]-'a'])
tree[rt][s[i]-'a']=++m;
rt=tree[rt][s[i]-'a'];
num[rt]++;
}
}*/
void dfs(int rt,int depth)
{
if(num[rt]==1)//节点为一的点就加上它的深度
{
ans+=depth;
return ;
}
for(int i=0;i<26;i++)
{
if(tree[rt][i])
dfs(tree[rt][i],depth+1);
}
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
m=0;
scanf("%d",&n);
memset(tree[0],0,sizeof(tree[0]));
num[0]=0;
while(n--)
{
scanf("%s",s);
build(0,s);
}
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
</span>