比赛 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(){;}