解题思路:
首先我们可以发现:
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 == '