比赛 |
20170519 |
评测结果 |
AAAAAAAAAA |
题目名称 |
strcmp()函数 |
最终得分 |
100 |
用户昵称 |
31627012 |
运行时间 |
0.413 s |
代码语言 |
C++ |
内存使用 |
29.94 MiB |
提交时间 |
2017-05-19 20:59:35 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxnode=4000*1000+10;
const int sigma_size=26;
const int maxl=1000+10;
int n;
char word[maxl];
struct Trie {
int head[maxnode];
int next[maxnode];
char ch[maxnode];
int tot[maxnode];
int sz;
long long ans;
void clear() { sz=1;tot[0]=head[0]=next[0]=0; }
inline void insert(const char *s){
int u=0,v,n=strlen(s);
tot[0]++;
for(int i=0;i<=n;i++){
bool found=0;
for(v=head[u];v!=0;v=next[v])
if(ch[v]==s[i]){
found=1;
break;
}
if(!found){
v=sz++;
tot[v]=0;
ch[v]=s[i];
next[v]=head[u];
head[u]=v;
head[v]=0;
}
u=v;
tot[u]++;
}
}
inline 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!=0;v=next[v])
sum+=tot[v]*(tot[u]-tot[v]);
ans+=sum/2*(2*depth+1);
for(int v=head[u];v!=0;v=next[v])
dfs(depth+1,v);
}
}
inline long long count(){
ans=0;
dfs(0,0);
return ans;
}
};
Trie trie;
inline void work(){
int kase=1;
while(scanf("%d", &n)==1&&n){
trie.clear();
for(int i = 0;i<n;i++){
scanf("%s",word);
trie.insert(word);
}
printf("Case %d: %lld\n",kase++,trie.count());
}
}
inline int mian(){
freopen("strcmp.in","r",stdin);
freopen("strcmp.out","w",stdout);
work();
}
int miku=mian();
int main(){;}