首页 > 代码库 > UVa 11732 strcmp()函数(左孩子右兄弟表示法)
UVa 11732 strcmp()函数(左孩子右兄弟表示法)
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<cstring> 5 #include<vector> 6 using namespace std; 7 8 const int maxn = 4000 * 1000 + 10; 9 int n;10 long long ans;11 12 struct Trie13 {14 int head[maxn]; //head[i]为第i个结点的左儿子编号15 int next[maxn]; //next[i]为第i个结点的右兄弟编号16 char ch[maxn]; //第i个结点上的字符17 int tot[maxn];18 int sz;19 20 void init()21 {22 sz = 1;23 head[0] = tot[0] = next[0] = 0;24 }25 26 void insert(char *s)27 {28 int u = 0, v, n = strlen(s);29 tot[0]++;30 for (int i = 0; i <= n; i++)31 {32 bool found = false;33 for (v = head[u]; v != 0; v = next[v])34 {35 if (ch[v] == s[i])36 {37 found = true;38 break;39 }40 }41 if (!found)42 {43 v = sz++;44 tot[v] = 0;45 ch[v] = s[i];46 next[v] = head[u];47 head[u] = v;48 head[v] = 0;49 }50 u = v;51 tot[u]++;52 }53 }54 55 void dfs(int depth, int u)56 {57 if (head[u] == 0)58 ans += tot[u] * (tot[u] - 1)*depth;59 else60 {61 int sum = 0;62 for (int v = head[u]; v != 0; v = next[v])63 sum += tot[v] * (tot[u] - tot[v]);64 ans += sum / 2 * (2 * depth + 1);65 for (int v = head[u]; v != 0; v = next[v])66 dfs(depth + 1, v);67 }68 }69 }t;70 71 int main()72 {73 //freopen("D:\\txt.txt", "r", stdin);74 char str[1005];75 int kase = 0;76 while (~scanf("%d", &n), n)77 {78 t.init();79 while (n--)80 {81 scanf("%s", str);82 t.insert(str);83 }84 ans = 0;85 t.dfs(0,0);86 printf("Case %d: %lld\n", ++kase, ans);87 }88 return 0;89 }
UVa 11732 strcmp()函数(左孩子右兄弟表示法)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。