题目来源:UVa 11732 strcmp() Anyone?
题意:求若干个字符串两两比较需要的次数 than 和 that 需要比7次 there和the需要7次 就是LCP的长度*2+1 特判2个字符串一样的情况abc和abc需要8次
思路:利用字典树 每个点出现分叉的时候说明有些字符串可以比较出来了 总和加上当前深度*和当前节点不一样的兄弟数 链表超时了 学习了左儿子又兄弟表示法
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxnode = 4000*1000; int head[maxnode]; int next[maxnode]; int val[maxnode]; char ch[maxnode]; int sz; long long ans; void insert(char *s) { int n = strlen(s); int u = 0, v; for(int i = 0; i <= n; i++) { for(v = head[u]; v; v = next[v]) if(s[i] == ch[v]) break; if(!v) { v = sz++; val[v] = 0; ch[v] = s[i]; next[v] = head[u]; head[u] = v; head[v] = 0; } ans += (long long)(i*2+1)*(val[u]-val[v]); val[u]++; u = v; if(i == n) { ans += (long long)val[v]*(i+1)*2; val[v]++; } u = v; } } int main() { int cas = 1; int n; while(scanf("%d", &n) && n) { ans = 0; sz = 1; head[0] = next[0] = val[0] = 0; while(n--) { char s[1111]; scanf("%s", s); insert(s); } printf("Case %d: %lld\n", cas++, ans); } return 0; }
UVa 11732 strcmp() Anyone? 求字符串比较次数,布布扣,bubuko.com
UVa 11732 strcmp() Anyone? 求字符串比较次数
原文:http://blog.csdn.net/u011686226/article/details/23347867