#include<bits/stdc++.h>
using namespace std;
const int maxx=4e6+10;
struct tire{
int head[maxx];
int next[maxx];
char ch[maxx];
int tot[maxx];
int sz;
long long ans;
void clear()
{
sz=1;
tot[0]=head[0]=next[0]=0;
}
void insert(const char *s)
{
int u=0,v,n=strlen(s);
tot[0]++;
for(int i=0;i<=n;++i)
{
bool f=0;
for(v=head[u];v;v=next[v])
{
if(ch[v]==s[i])
{
f=1;
break;
}
}
if(!f)
{
v=sz++;
tot[v]=0;
ch[v]=s[i];
next[v]=head[u];
head[u]=v;
head[v]=0;
}
u=v;
tot[u]++;
}
}
void dfs(int depth,int u)
{
if(head[u]==0)
ans+=tot[u]*(tot[u]-1)*depth;
else {
int sum=0;
for(int v=head[u];v;v=next[v])
{
sum+=tot[v]*(tot[u]-tot[v]);
}
ans+=sum/2*(2*depth+1);
for(int v=head[u];v;v=next[v])
dfs(depth+1,v);
}
}
long long count()
{
ans=0;
dfs(0,0);
return ans;
}
};
char a[1005];
int main()
{
tire tt;
int cnt=0;
int n;
while(scanf("%d",&n)&&n)
{
tt.clear();
for(int i=1;i<=n;++i)
{
scanf("%s",a);
tt.insert(a);
}
printf("Case %d: %lld\n",++cnt,tt.count());
}
}
trie树 左儿子右兄弟链表辅助记录(节约空间) uva11732
最新推荐文章于 2024-10-01 23:05:47 发布