LINK1

LINK2


题目大意

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

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

思路

该怎么统计答案呢?

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

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

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

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

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

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

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


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

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

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

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


//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
typedef pair<int, int> pi;
typedef long long ll;
typedef double db;
#define fi first
#define se second
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 6e6 + 10;
struct Node {
char ch;
int val;
Node *son, *bro;
Node(char ch = 0, int val = 0, Node *son = NULL, Node *bro = NULL):ch(ch), val(val), son(son), bro(bro) {}
} *rt, pool[N], *cur = pool;
ll ans;
void insert(char *s) {
int len = strlen(s);
s[len] = '#';
Node *u = rt, *v;
fu(i, 0, len) {
v = u->son;
for (; v; v = v->bro)
if (v->ch == s[i]) break;
if (!v) {
v = new (cur++) Node(s[i], 0, NULL, u->son);
u->son = v;
}
ans += 1ll * (u->val - v->val) * (2 * i + 1);
if (i == len) {
ans += 1ll * v->val * (2 * len + 2);
++v->val;
}
++u->val;
u = v;
}
}
char s[N];
int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
#endif
int n, tot = 0;
while (1) {
Read(n);
if (!n) break;
cur = pool;
rt = new (cur++) Node();
ans = 0;
fu(i, 1, n) {
scanf("%s", s);
insert(s);
}
printf("Case %d: %lld\n", ++tot, ans);
}
return 0;
}

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. 4.8 Routing -- Specifying The URL Type

    1. 默认的路由器使用浏览器的hash来加载应用程序的开始状态并且当你移动时同步保持.目前,这依赖于浏览器中存在的hashchange事件. 2. 假设下面的路由器,输入/#/posts/new将会把 ...

  2. xshell过期了怎么办,是学生就用学生版吧

    访问这里:https://www.netsarang.com/download/software.html 点击Free for Home & School 下载家庭版和学生版 来到这个页面了 ...

  3. poj1228 Grandpa's Estate

    地址:http://poj.org/problem?id=1228 题目: Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  4. acdream1174 合并同类项

    这题说的是 给出N,a[1]... a[N],还有M,b[1]... b[M]long long ans = 0;for(int i = 1; i <= N; i ++)    for(int ...

  5. SoapUI、Jmeter、Postman三种接口测试工具的比较

    1.  用例组织方式 首先是用例组织方式的不同,不同的目录结构与组织方式代表不同工具的测试思想,学习一个测试工具应该首先了解其组织方式. SoapUI的组织方式如下图,最上层是WorkSpace,每个 ...

  6. [one day one question] iphone6 plus h5页面滑动莫名卡

    问题描述: iphone6 plus h5页面滑动莫名卡,这怎么破? 解决方案: 比较奇葩的问题,在找不到任何问题的情况下,可以考虑在下发现的解决方案,html,body未添加height: 100% ...

  7. JavaWeb实现分页的四种方法

    一.借助数组进行分页 原理:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录. 实现: 首先在dao层,创建 ...

  8. Linux的crontab

    如果要让unix系统重复,定期做一件事,我们就会用到crontab. 实质上真正去执行每一个重复任务的是cron,cron是的unix家族的一个后台常驻程序,cron是由cron文件来驱动的,cron ...

  9. HDU 6354 Everything Has Changed(余弦定理)多校题解

    题意:源点处有个圆,然后给你m个圆(保证互不相交.内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度). 思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了.题 ...

  10. asp.net web api的源码

    从安装的NuGet packages逆向找回去 <package id="Microsoft.AspNet.WebApi.Core" version="5.2.7& ...