题解:http://blog.csdn.net/u013480600/article/details/23122503

我的代码一直TLE,,,看了人家的之后,认为1、链式前向星比較好,2、*depth而不是每过一个节点就计算,这一点非常好

我是基本copy别人的代码,自己加了凝视,留个记号,随后重写,

这道题相同作为链式前向星的Trie的模板

#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;
#define ll long long
const int MAXN=4002*1002+100;struct Trie
{int head[MAXN];//其值为在边集的下标int next[MAXN];//next[j]第j条边的下一条边在边集的下标int tot[MAXN];char str[MAXN];//相当于边集了 边存储字符int sz;//head下标的上界,也相当于节点ll ans;void clear(){ans=0;sz=1;head[0]=next[0]=tot[0]=0;}void insert(char *s){int n=strlen(s),u=0;tot[u]++;for(int i=0;i<=n;i++)//空字符也插入{bool found=false;for(int j=head[u];j;j=next[j])if(str[j] == s[i]){u=j;found=true;break;}if(!found)//节点不存在{next[sz]=head[u];head[u]=sz;head[sz]=0;//tot[sz]=0;//新的节点还没有连边str[sz]=s[i];//初始化边信息,边存储字符u=sz++;//u存储新的子结点}tot[u]++;}}void dfs(int dep, int u){if(!head[u])//到了叶子节点{ans+=tot[u]*(tot[u]-1)*dep;}else{int sum=0;for(int v=head[u];v;v=next[v])  //**sum+=tot[v]*(tot[u]-tot[v]);//**ans+= sum/2*(dep*2+1);//这里我自己做的时候没有想到,,,,事实上分叉后跟分叉前都能够用上面标注**的方法计算for(int v=head[u];v;v=next[v])dfs(dep+1,v);}}ll cal(){ans=0;dfs(0,0);return ans;}
};
Trie trie;
char word[1000+100];
int main()
{int icase=0,n;while(scanf("%d",&n) && n){trie.clear();for(int i=0;i<n;i++){scanf("%s",word);trie.insert(word);}printf("Case %d: %lld\n",++icase,trie.cal());}return 0;
}

我的tle的代码  随后改动

#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;#define ll long longconst int N = 4011*1000+10;
const int tk = 75;
const int tb = '0'; // tk叉; 起始字母为tb;
int top, tree[N][tk + 2];  // N: 最大结点个数 top: 第一层有多少节点
char str[1010];
void init(){top = 1;memset(tree[0], 0, sizeof(tree[0]));
}void Insert(char*s, int Rank = 1){int rt, nxt;for(rt = 0; *s; rt = nxt, ++s) {nxt = tree[rt][*s - tb];if(0 == nxt) {//没被使用时插入tree[rt][*s - tb] = nxt = top;memset(tree[top], 0, sizeof(tree[top]));top++;}tree[nxt][tk]++;//其值表示有多少单词经过}tree[rt][tk+1] = Rank;//1表示存在0表示不存在,也能够赋予其其它含义
}ll solve(int rt,int last)
{if(tree[rt][tk] <= 1)return 0;//到结尾仅仅须要比較一次,假设仅仅有一个,也仅仅须要比較一次ll ans=0;for(int i=0;i<tk;i++)if(tree[rt][i]){ans=ans+tree[tree[rt][i]][tk]*(last-tree[tree[rt][i]][tk]);//计算子树森林}ans/=2;for(int i=0;i<tk;i++){if(tree[rt][i]){ans+=solve(tree[rt][i],tree[tree[rt][i]][tk]);}}//return ans+2*C[tree[rt][tk]][2];return ans+tree[rt][tk]*(tree[rt][tk]-1);
}
int main()
{freopen("uva11732.txt","r",stdin);int icase=0,n,len;//calC();while(scanf("%d",&n)==1 && n){init();tree[0][tk]=n;for(int i=0;i<n;i++){scanf("%s",str);Insert(str);}printf("Case %d: %lld\n",++icase,solve(0,n)-n*(n-1));}return 0;
}

转载于:https://www.cnblogs.com/yxwkf/p/4027238.html

uva 11732 - strcmp() Anyone? 不错的Trie题相关推荐

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

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

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

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

  3. strcmp() Anyone? UVA - 11732 左孩子右兄弟Trie/计数

    #include<bits/stdc++.h> using namespace std; #define ll long longconst int maxnode = 4000 * 10 ...

  4. Uva 11732 strcmp()函数

    题目链接:https://vjudge.net/contest/158125#problem/A 题意: 系统中,strcmp函数是这样执行的,给定 n 个字符串,求两两比较时,strcmp函数要比较 ...

  5. uva 11732 strcmp() Anyone?

    https://vjudge.net/problem/UVA-11732 题意: 给出许多字符串,他们两两按下面的函数比较 输出比较次数 s[i]==t[i]  ,  和  s[i]=='\0'   ...

  6. UVa 11732 (Tire树) strcmp() Anyone?

    这道题也是卡了挺久的. 给出一个字符串比较的算法,有n个字符串两两比较一次,问一共会有多少次比较. 因为节点会很多,所以Tire树采用了左儿子右兄弟的表示法来节省空间. 假设两个不相等的字符串的最长公 ...

  7. UVA 109 SCUD Busters【凸包模拟题】

    题目大意:世界由几个互不重叠领土但彼此敌对的国家组成,每个国家有一个发电站,负责给本国发电. 1,给出每个国家的建筑数(包括发电站和房子数),每个国家用最少的围墙将本国保护起来(凸包): 2,现在有不 ...

  8. 推荐一个很不错的刷题网站

    分享 小伙伴们,还在为学习编程语言找不到好的练习题而苦恼吗?今天小菜分享一个刷题网站:https://www.codewars.com/dashboard.这个网站和力扣不同的是,这真的是适合人类的网 ...

  9. UVA 12086 Potentiometers(线段树裸题)

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

最新文章

  1. 科大讯飞AIUI(1)
  2. 浏览器更改实现webstrom等前端编辑器的同步更新
  3. 大数据项目产品选型的五个建议
  4. Python遍历字典的方法
  5. java怎么构造map_Java中Map结构
  6. OC学习篇之---归档和解挡
  7. 电大法学本科计算机考试题,电大法学本科计算机形成性考核作业
  8. 微信小程序 全局变量异步函数_微信小程序【生命周期】
  9. oracle之创建和管理表之练习题
  10. java 文本变量_如何将一变量作为可配置文件 java
  11. 信息资源管理——总结
  12. 前端中函数 , 伪函数 , DOM
  13. Python基于迁移学习的手势识别实战【图像多分类任务】【实测准确度超过99.5%】
  14. 带通滤波器作用和用途_带通滤波器是什么,带通滤波器的作用
  15. 使用外网访问Flask项目
  16. 【环境配置】octopus + dirt--ubuntu18.04
  17. python根据参数判断性别准吗_根据数据能判断男宝或女宝概率么?
  18. ICNS格式文件用途及分析
  19. 支持webrtc的摄像头
  20. Obj文件解析相关bug心得

热门文章

  1. 上海网络推广浅析一个优质的404页面能给网站带来什么优化效果?
  2. 网络营销专员浅析在网络营销中网站关键词对网站流量获取有何影响?
  3. 网络推广——网络推广专员面对网站收录异常要学会多角度分析
  4. 浅析网站如何才能最大化获得用户访问量?
  5. 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  6. python成员变量和全局变量_python 全局变量和局部变量详解笔记
  7. Proxy代理 和 Reflect反射(反射的是obj)的概念
  8. 01-----JavaScript简介
  9. JAVA线程间的状态转换
  10. Spring-cloud-eureka-robbin-hystrix-feign