UVA 11732——Trie

UVA 11732——Trie

解题思路:

  首先我们可以发现:

    1.若两个字符串A、B不相等,且它们的公共前缀为S,则它们的比较次数为:2 * len(S) + 1;

    2.若两个字符串相等,设为A,则它们的比较次数为 2 * ( len(A) + 1 )    //注意考虑结束符' '

  那么我们可以建立前缀树,在向前缀树中插入字符串的过程中,如果遇到分叉结点则需要进行比较。

  特别注意:"aaaa","aa"以及"aaaa","aaaa"的情况

  具体做法:

    Trie维护每个结点的val和flag,其中val表示经过每个结点的字符串个数,flag表示是否是分叉结点。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cctype>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int maxnode = 4000*1000 + 10;
 9 const int _size = 63;
10 long long ans;
11 
12 struct Trie {
13     int ch[maxnode][_size];
14     int val[maxnode];
15     int flag[maxnode];
16     int sz;
17     Trie() {
18         sz = 1;
19         memset(ch[0], 0, sizeof (ch[0]));
20     }
21     int idx(int c) {
22         if(c == '