我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献。

另外这题主要就是Trie树的孩子兄弟表示法:

因为数据范围,4000个字符串每个字符串长度1000且字符的范围有62个,用孩子链表表示法最坏,4000*1000*62,再*4Byte,近1GB的内存,太大了,有许多空指针浪费空间。

所以需要用孩子兄弟表示法压缩字典树,4000*1000*2,左孩子右兄弟,用时间换空间。

 #include<cstdio>
#include<cstring>
using namespace std;
char key[];
int ch[][],cnt[],flag[],tn;
void insert(char *s){
int x=;
for(int i=; s[i]; ++i){
if(ch[x][]==){
ch[x][]=++tn;
x=ch[x][];
key[x]=s[i];
++cnt[x];
continue;
}
for(x=ch[x][]; key[x]!=s[i] && ch[x][]; x=ch[x][]);
if(key[x]!=s[i]){
ch[x][]=++tn;
x=ch[x][];
key[x]=s[i];
++cnt[x];
}else ++cnt[x];
}
++flag[x];
} int main(){
int t=,n;
char str[];
while(~scanf("%d",&n) && n){
tn=;
memset(key,,sizeof(key));
memset(ch,,sizeof(ch));
memset(cnt,,sizeof(cnt));
memset(flag,,sizeof(flag));
while(n--){
scanf("%s",str);
insert(str);
}
long long res=;
int tot=,sn=;
for(int i=; i<=tn; ++i){
res+=(cnt[i]-)*cnt[i];
if(flag[i]){
res+=(flag[i]-)*flag[i];
tot+=flag[i];
}
}
long long tmp=;
for(int i=; i<=tn; ++i){
if(flag[i]) tmp+=(tot-flag[i])*flag[i];
}
res+=tmp>>;
printf("Case %d: %lld\n",++t,res);
}
return ;
}

UVa11732 "strcmp()" Anyone?(Trie树+孩子兄弟表示法)的更多相关文章

  1. 选课 - 树型DP(孩子兄弟建树法)

    题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课并考核通 ...

  2. linux创建文件树,孩子兄弟树(或广义表),创建文件树及其訪问

    假设在Linux下要訪问一个目录. 我们须要知道一下系统调用. 1.opendir(path); //注意path是绝对路径 2.ptr=readdir(dir);//dir 为opendir();正 ...

  3. trie树的建立方法汇总

    方法一:孩子兄弟表示法 即对于某一个点,记录他的第一个孩子以及他的同父亲的下一个儿子. 具体代码如下: #include <cstdio> #include <cstring> ...

  4. hdu 1004 Let the Balloon Rise strcmp、map、trie树

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  5. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  6. [转] Trie树详解及其应用

    一.知识简介         最近在看字符串算法了,其中字典树.AC自动机和后缀树的应用是最广泛的了,下面将会重点介绍下这几个算法的应用.       字典树(Trie)可以保存一些字符串->值 ...

  7. 从Trie树到双数组Trie树

    Trie树 原理 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,能在常数时间O(len)内实现插入和查 ...

  8. Trie树详解及其应用

    一.知识简介        最近在看字符串算法了,其中字典树.AC自动机和后缀树的应用是最广泛的了,下面将会重点介绍下这几个算法的应用.      字典树(Trie)可以保存一些字符串->值的对 ...

  9. Secret Message ---- (Trie树应用)

    Secret Message   总时间限制:  2000ms  内存限制:  32768kB 描述 Bessie is leading the cows in an attempt to escap ...

随机推荐

  1. We are 歪果仁带你灰

    We are 歪果仁带你灰 我叫赖彦谕 不爱什么诗和远方 只爱饭桌上的一菜一肉一杯酒 真的很希望有一天我可以成为那个对待学习像对待美食一样的人类 让自己沉浸在美食和知识的海洋中无法自拔 我也对未来的软 ...

  2. JSONModel - 字符串换转实体类

     JSONModel https://github.com/icanzilb/JSONModel/ 一. 获取属性的元数据 const char *attrs = property_getAttrib ...

  3. [OpenJudge 3063]罪犯问题

    [OpenJudge 3063]罪犯问题 试题描述 一天,警官抓获了N个嫌犯,审问N个罪犯的途中,作为警长助手的你突然发现其中被确定为罪犯的K号人是你曾经出生入死的兄弟,你不能眼睁睁看着他被抓进牢里. ...

  4. Coursera台大机器学习课程笔记14 -- Validation

    这节课是接着上节的正则化课程的,目的也是为了防止overfitting. 第一小节讲了模型的选择,前面讲了很多模型,那么如何做出正确的选择呢?我们的目标是选择最小的Eout目标函数.首先应避免视觉化选 ...

  5. CSS3.0盒模型display:-webkit-box;的使用

    box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典   的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没 ...

  6. intellij idea 如何更改编辑器文本字体和大小

    换上了intellij idea之后,第一件事就是想要改变下文字字体,因为在我这个27寸的2k分辨率的屏幕上,文字显然太小了. intellij idea字体设值分成两部分,一部分是UI部分字体字号设 ...

  7. css用标签选择器在本页写样式

    <title>静夜思</title><style type="text/css">p{ color:#ff0000;   font-size:2 ...

  8. 简单方便地扩充Python的系统路径

    参考: http://www.elias.cn/Python/PythonPath?from=Develop.PythonPath http://v2in.com/pth-file-usage-in- ...

  9. docke跨主机通信之gre隧道

    GRE简介 GRE可以对网络层的任何协议来进行封装,类似LVS的IPIP协议,在原有的数据报上增加GRE协议数据报.然后在网络上传输,到达对端后,解开GRE数据报头,得到真实的数据报.其中的mac地址 ...

  10. CocoaPods报错及解决方法记录

    [!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com ...