zoukankan      html  css  js  c++  java
  • (trie) UVA

    题目链接

    将所有的字符串一起依次建立trie树。

    在每一次insert的过程中更新答案。每次insert,每走到一个结点(包括根结点)时,一定会与该结点的所有子结点比较一次,之后按照改字符串的字符,走到下一个结点,只与之前也走到该结点的字符串发生第2次比较。其他先前父节点的子结点的字符串,都因为那一次比较就已经出现不同而结束了比较。重复该过程。到最后的叶子结点时循环已经结束,但是注意还需要再加上必定发生的“第二次比较”。

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <queue>
     8 #include <set>
     9 #include <map>
    10 #include <list>
    11 #include <vector>
    12 #include <stack>
    13 #define mp make_pair
    14 #define MIN(a,b) (a>b?b:a)
    15 #define rank rankk
    16 //#define MAX(a,b) (a>b?a:b)
    17 typedef long long ll;
    18 typedef unsigned long long ull;
    19 const int MAX=1e5+5;
    20 const int INF=1e9+5;
    21 const int B=1024;//桶的大小
    22 const double M=4e18;
    23 const int MAX_NODE=4e6+5;
    24 const int sigma_size=80;
    25 using namespace std;
    26 const int MOD=1e9+7;
    27 typedef pair<int,int> pii;
    28 const double eps=0.000000001;
    29 ll an;
    30 struct Trie
    31 {
    32     int ch[MAX_NODE][sigma_size];
    33     int val[MAX_NODE];
    34     int num;
    35     Trie(){num=1;memset(ch[0],0,sizeof(ch[0]));memset(val,0,sizeof(val));}
    36     int idx(char c)
    37     {
    38 //        char oh='';
    39         if(c=='')
    40             return 0;
    41         else
    42         return c-'0'+1;
    43     }
    44     void clear(){num=1;memset(ch[0],0,sizeof(ch[0]));memset(val,0,sizeof(val));}
    45     void insert(char *x,int v)
    46     {
    47         int u=0,len=strlen(x);
    48 //        x[len]='';
    49         ++len;
    50         for(int i=0;i<len;i++)
    51         {
    52 //            printf("%d %d
    ",i,val[u]);
    53             an+=val[u];
    54             if(i)
    55                 an+=val[u];
    56             ++val[u];
    57             int to=idx(x[i]);
    58             if(!ch[u][to])
    59             {
    60                 memset(ch[num],0,sizeof(ch[num]));
    61                 val[num]=0;
    62                 ch[u][to]=num++;
    63             }
    64             u=ch[u][to];
    65         }
    66         if(len)
    67             an+=val[u];
    68         ++val[u];
    69     }
    70 };
    71 Trie dic;
    72 int n;
    73 char tem[MAX];
    74 int cnt=0;
    75 int main()
    76 {
    77 //    freopen("in.txt","r",stdin);
    78 //    freopen("out.txt","w",stdout);
    79     while(scanf("%d",&n)&&n)
    80     {
    81         an=0LL;
    82         dic.clear();
    83         for(int i=0;i<n;i++)
    84         {
    85             scanf("%s",tem);
    86 //            if(cnt==94)
    87 //                printf("%s
    ",tem);
    88             dic.insert(tem,1);
    89         }
    90 //        ++cnt;
    91         printf("Case %d: %lld
    ",++cnt,an);
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    C语言I博客作业03
    C语言I—2019秋作业02
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    第一周作业
    C语言I博客作业04
  • 原文地址:https://www.cnblogs.com/quintessence/p/6897701.html
Copyright © 2011-2022 走看看