解题思路:

  首先我们可以发现:

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

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

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

  特别注意:"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 = * + ;
  9. const int _size = ;
  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 = ;
  19. memset(ch[], , sizeof (ch[]));
  20. }
  21. int idx(int c) {
  22. if(c == '\0') return ;
  23. else if(isdigit(c)) return c - '';
  24. else if(c >= 'A' && c <= 'Z') return c - 'A' + ;
  25. else return c - 'a' + ;
  26. }
  27.  
  28. void insert(char *s) {
  29. int u = , n = strlen(s);
  30. val[u]++;
  31. int i;
  32. for(i = ; i <= n; i++) {
  33. int c = idx(s[i]);
  34. if(!ch[u][c]) {
  35. memset(ch[sz], , sizeof (ch[sz]));
  36. ch[u][c] = sz++;
  37. val[ch[u][c]] = ;
  38. if(val[u] > ){
  39. flag[u] = ;
  40. ans += (*i+) * (val[u]-val[ch[u][c]]);
  41. }
  42. }
  43. else {
  44. val[ch[u][c]]++;
  45. if(flag[u]) ans += (*i+) * (val[u]-val[ch[u][c]]);
  46. }
  47. u = ch[u][c];
  48.  
  49. }
  50. if(val[u] > ) {
  51. flag[u] = ;
  52. ans += (*i) * (val[u]-);
  53. }
  54. }
  55.  
  56. void clear() {
  57. sz = ;
  58. memset(val, , sizeof val);
  59. memset(ch[], , sizeof (ch[]));
  60. memset(flag, , sizeof flag);
  61. }
  62. };
  63.  
  64. char s[];
  65. Trie T;
  66.  
  67. int main(int argc, const char * argv[]) {
  68.  
  69. int n;
  70. int kase = ;
  71. while(scanf("%d", &n) == && n) {
  72. T.clear();
  73. ans = ;
  74. for(int i = ; i < n; i++) {
  75. scanf("%s", s);
  76. T.insert(s);
  77. }
  78.  
  79. printf("Case %d: %lld\n", kase++, ans);
  80. }
  81. return ;
  82. }

UVA 11732——Trie的更多相关文章

  1. uva 11732 (trie树)

    题意:求N个字符串两两比较,共比较了多少次? #include<iostream> #include<cstring> #include<cstdio> using ...

  2. UVA 11732 - strcmp() Anyone?(Trie)

    UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比較,须要比較的总次数(注意.假设一个字符同样.实际上要还要和'\0'比一次,相当比2次) 思路:建T ...

  3. 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?

    题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...

  4. UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)

    题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...

  5. UVA 11732 &quot;strcmp()&quot; Anyone? (Trie)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. Trie UVA 11732 "strcmp()" Anyone?

    题目传送门 题意:询问所有字符串的比较次数和(注意for循环内的比较也算) 分析:将所有字符串插入到字典树上,然后结点信息记录有几个字符串,那么每走到一个结点就能知道比较到此时需要的次数.学习到链表存 ...

  7. UVA 11732 strcmp() Anyone?(Trie的性质)

    strcmp() Anyone? strcmp() is a library function in C/C++ which compares two strings. It takes two st ...

  8. uva 11732 - strcmp() Anyone? 不错的Trie题

    题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,认为1.链式前向星比較好,2.*dept ...

  9. UVA - 11732 "strcmp()" Anyone?左兄弟右儿子trie

    input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...

随机推荐

  1. 面试问题:Vuejs如何实现双向绑定

    最近出去面试,栽在这个问题上,提到vuejs,面试官一般会让你说vuejs的特点,一般就要回答virtual dom tree, dom tree diff, 以及数据双向绑定,然后面试官会追问你,v ...

  2. python ndarray相关操作:转置、翻转

  3. 管理神话之"我还能做大量的技术工作"

    “你要知道,如果你想做好一件事,你就必须自己动手.”Clive一边咕哝着,一边走回自己的房间. Susan原本在埋头工作.她抬起头来,叹了口气.然后起身,跟着Clive穿过走廊,来到他的房间门口.她敲 ...

  4. Linux进程管理(二、 进程创建)

    通常使用fork创建进程, 也可以用vfork()和clone().fork.vfork和clone三个用户态函数均由libc库提供,它们分别会调用Linux内核提供的同名系统调用fork,vfork ...

  5. Handler, AsyncTask用法简单示例

    package com.jim.testapp; import android.app.Activity; import android.os.AsyncTask; import android.os ...

  6. VS2017 打包成exe

    在项目的解决方案 右键→ 新建项目  后出现如下选择 (如果没有找到,请在联机中搜索  visual studio installer 并安装) 选择项目类型 Setup Project,并输入名称, ...

  7. 【JZOJ4817】【NOIP2016提高A组五校联考4】square

    题目描述 输入 输出 样例输入 3 4 1 1 0 1 0 1 1 0 0 1 1 0 5 1 1 2 3 2 1 3 2 3 2 3 4 1 1 3 4 1 2 3 4 样例输出 1 1 1 2 2 ...

  8. JavaScript的六种数据类型与隐式转换

    一.六种数据类型 javascript的数据类型包括: (1)基本数据类型:number.string.boolean.null.undefined (2)对象:object object又包括Fun ...

  9. iOS 通知观察者的被调函数不一定运行在主线程

    Tony in iOS | 08/08/2013 iOS 通知观察者的被调函数不一定运行在主线程 今天修复Bug时候发现的一个小细节,记录下. 问题描述 事情是这样的:我在A视图(UITableVie ...

  10. Oracle使用——PLSQL查询表结构并导出EXCEL

    背景 有一次需要查询Oracle数据库中的所有表接口并且导出excel,方法记录如下 使用 使用PLSQL工具查询表结构,SQL语句如下 SELECT B.TABLE_NAME AS '表名', C. ...