LINK1

LINK2


题目大意

给你一些字符串,并定义了一个函数(具体见题面)

问你把任意两个字符串放到函数里面得到的值的和是多少

思路

该怎么统计答案呢?

每次考虑当前插入的串和所有已经插入过的串一起统计答案

然后考虑一下怎么统计,假设当前深度是dep

并且现在是u,即将向v移动指针

那么怎么同几当前这一层的答案呢?

所有在v的子树中的节点显然是不能在这一层统计答案的

所以就考虑统计和所有不在同一个子树的答案

具体实现很简单,读者自己思考吧


注意在每一次走到字符串的末尾的时候需要特判

和他相同或者包含它的字符串会比较更多的次数,所以不能直接停止也要继续移动指针,可以强行让最后一个位置变成奇怪字符

然后这题需要左兄弟右儿子的trie

具体实现参考代码(其实并不麻烦,别怕)


  1. //Author: dream_maker
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. //----------------------------------------------
  5. typedef pair<int, int> pi;
  6. typedef long long ll;
  7. typedef double db;
  8. #define fi first
  9. #define se second
  10. #define fu(a, b, c) for (int a = b; a <= c; ++a)
  11. #define fd(a, b, c) for (int a = b; a >= c; --a)
  12. #define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
  13. const int INF_of_int = 1e9;
  14. const ll INF_of_ll = 1e18;
  15. template <typename T>
  16. void Read(T &x) {
  17. bool w = 1;x = 0;
  18. char c = getchar();
  19. while (!isdigit(c) && c != '-') c = getchar();
  20. if (c == '-') w = 0, c = getchar();
  21. while (isdigit(c)) {
  22. x = (x<<1) + (x<<3) + c -'0';
  23. c = getchar();
  24. }
  25. if (!w) x = -x;
  26. }
  27. template <typename T>
  28. void Write(T x) {
  29. if (x < 0) {
  30. putchar('-');
  31. x = -x;
  32. }
  33. if (x > 9) Write(x / 10);
  34. putchar(x % 10 + '0');
  35. }
  36. //----------------------------------------------
  37. const int N = 6e6 + 10;
  38. struct Node {
  39. char ch;
  40. int val;
  41. Node *son, *bro;
  42. Node(char ch = 0, int val = 0, Node *son = NULL, Node *bro = NULL):ch(ch), val(val), son(son), bro(bro) {}
  43. } *rt, pool[N], *cur = pool;
  44. ll ans;
  45. void insert(char *s) {
  46. int len = strlen(s);
  47. s[len] = '#';
  48. Node *u = rt, *v;
  49. fu(i, 0, len) {
  50. v = u->son;
  51. for (; v; v = v->bro)
  52. if (v->ch == s[i]) break;
  53. if (!v) {
  54. v = new (cur++) Node(s[i], 0, NULL, u->son);
  55. u->son = v;
  56. }
  57. ans += 1ll * (u->val - v->val) * (2 * i + 1);
  58. if (i == len) {
  59. ans += 1ll * v->val * (2 * len + 2);
  60. ++v->val;
  61. }
  62. ++u->val;
  63. u = v;
  64. }
  65. }
  66. char s[N];
  67. int main() {
  68. #ifdef dream_maker
  69. freopen("input.txt", "r", stdin);
  70. #endif
  71. int n, tot = 0;
  72. while (1) {
  73. Read(n);
  74. if (!n) break;
  75. cur = pool;
  76. rt = new (cur++) Node();
  77. ans = 0;
  78. fu(i, 1, n) {
  79. scanf("%s", s);
  80. insert(s);
  81. }
  82. printf("Case %d: %lld\n", ++tot, ans);
  83. }
  84. return 0;
  85. }

UVA11732 "strcmp()" Anyone?【左儿子右兄弟Trie】的更多相关文章

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

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

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

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

  3. Vijos p1518 河流 转二叉树左儿子又兄弟

    左儿子又兄弟的转发一定要掌握啊,竞赛必用,主要是降低编程复杂度,省时间.个人觉得状压DP也是为了降低编程复杂度. 方程就不说了,程序应该能看得懂,用的记忆化搜索,方便理解. #include<c ...

  4. UVa 11732 strcmp()函数(左孩子右兄弟表示法)

    #include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...

  5. UVALive - 3942 左儿子trie DP

    题意:白书P209 本题用普通字典树会更快,为了练习还是尝试再敲一遍左儿子-右兄弟字典树(其实就是字典树上开前向星) dp[i]为满足[i...len)的分配方案数,转移方程为dp[i]=sum{dp ...

  6. uva11732 strcmp() Anyone?

    题意:给出多个字符串,两两配对,求总配对次数. 思路:如果两个字符串一样,ans=strlen(字符串)*2+2,如果不同,ans=公共前缀长度*2+1:用左儿子右兄弟建字典树.插入一个字符计算一次. ...

  7. UVa11732 "strcmp()" Anyone?(Trie树+孩子兄弟表示法)

    我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献. 另外这题主要就是Trie树的孩子兄弟表示法: ...

  8. 【代码笔记】iOS-可以向左(右)滑动

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  9. js实现图片加载特效(从左到右,百叶窗,从中间到两边)

    /* 网上百度的,感觉”从中间到两边“的效果写的不是很好,改了一下,感觉可以了!*/<html> <head> <title></title> < ...

随机推荐

  1. python 2.7中文字符串的匹配(参考)

    #!/bin/env python #-*- coding:utf-8 -*- import urllib import os,sys,json import ssl context = ssl._c ...

  2. 查准率与查全率(precision and recall) 的个人理解

    假设要识别照片中的狗的,在一些照片中,包含12只狗的照片和一些猫的照片.算法识别出有8只狗.在确定的8只狗中,5只实际上是狗(真阳性TP),而其余的是猫(假阳性FP).该程序的精度为5/8,而其召回率 ...

  3. 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution

    A - Odd Palindrome 水. #include <bits/stdc++.h> using namespace std; #define N 110 char s[N]; i ...

  4. Codeforces Round #265 (Div. 2) E

    这题说的是给了数字的字符串 然后有n种的操作没次将一个数字替换成另一个字符串,求出最后形成的字符串的 数字是多大,我们可以逆向的将每个数推出来,计算出他的值和位数记住位数用10的k次方来记 1位就是1 ...

  5. Python 以指定列宽格式化字符串

    问题: 有一些长字符串,想以指定的列宽将他们重新格式化 解决方案: 使用textwrap模块来格式字符串的输出. textwrap 模块对于字符串打印时非常有用的,特别是当希望输出自动匹配终端大小的时 ...

  6. 20155201 实验三《Java面向对象程序设计》实验报告

    20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...

  7. 【eclipse】查看jar乱码问题解决

  8. Markdown中的表格

    参考:在简书上用Markdown写表格 | Tables | Are | Cool | | ------------- |:-------------:| -----:| | col 3 is | r ...

  9. Coursera SDN M1.2.1 SDN History: Programmable Networks 2

    NOTE Capsules Example 1.Type Field: excute forwarding routine => carry program 2.Previous address ...

  10. 用训练好的caffemodel来进行分类

    caffe程序自带有一张小猫图片,存放路径为caffe根目录下的 examples/images/cat.jpg, 如果我们想用一个训练好的caffemodel来对这张图片进行分类,那该怎么办呢? 如 ...