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

input

n 2<=n<=4000

s1

s2

...

sn

1<=len(si)<=1000

output

输出用strcmp()两两比较si,sj(i!=j)要比较的次数,结果在long long范围内(相同字符比较两次,不相同字符比较一次,包括'\0')

做法:由于字符集太大,要用左兄弟右儿子的trie保存字符,不用每次都开ch[62]个孩子

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <ctime>
11 #include <cmath>
12 #include <cctype>
13 #define MAX 100000
14 #define LL long long
15 #define mod 20071027
16 struct node
17 {
18     int sz;
19     char val;
20     node*ch[2];            //ch[1]兄弟,ch[0]儿子
21     node()
22     {
23         ch[0]=ch[1]=NULL;
24         sz=0;
25     }
26 };
27 char word[1010];
28 int n,cas=1;
29 long long sum;
30 long long insert(char*s,node*u)
31 {
32     long long sum=0,lastsz=u->sz++;
33     for(;*s||*(s-1);s++)
34     {
35         if(!u->ch[0])            //易错,要先把新建的结点连接到父结点才能往下走,否则新建之后父节点无法再读取到该结点
36         {
37             u->ch[0]=new node;
38             u->ch[0]->val=*s;
39         }    
40         for(u=u->ch[0];u->val!=*s;u=u->ch[1])
41         {
42             if(!u->ch[1])
43             {
44                 u->ch[1]=new node;
45                 u->ch[1]->val=*s;
46             }
47         }    
48         sum+=lastsz+u->sz;
49         lastsz=u->sz++;
50     }
51     return sum;
52 }
53 /*//这样可以将父节点的ch和新建的结点绑定起来,传过来的是&root
54 long long insert(char*s,node**u)
55 {
56     long long sum=0,lastsz=(*u)->sz++;
57     for(;*s||*(s-1);s++)
58     {
59         printf("%p\n",u);
60         for(u=&((*u)->ch[0]);(*u)&&(*u)->val!=*s;u=&((*u)->ch[1]));
61         if(*u==NULL)
62         {
63             *u=new node;
64             (*u)->ch[0]=(*u)->ch[1]=NULL;
65             (*u)->val=*s;
66         }
67         sum+=lastsz+(*u)->sz;
68         lastsz=(*u)->sz++;
69     }
70     return sum;
71 }*/
72 void freenode(node*u)
73 {
74     if(u==NULL) return;
75     freenode(u->ch[0]);
76     freenode(u->ch[1]);
77     delete u;
78 }
79 int main()
80 {
81     //freopen("/home/user/桌面/in","r",stdin);
82     while(scanf("%d",&n)==1&&n)
83     {
84         sum=0;
85         node *root=new node;
86         while(n--)
87         {
88             scanf("%s",word);
89             sum+=insert(word,root);
90         }
91         printf("Case %d: %lld\n",cas++,sum);
92         freenode(root);
93     }
94     //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
95     return 0;
96 }
97 
98 my Code
my Code
 1 #include <cstdio>  
 2 #include <cstring>  
 3 #include <iostream>  
 4 #include <algorithm>  
 5 using namespace std;  
 6   
 7 #define repf(i,a,b) for(int i=(a);i<=(b);i++)  
 8 typedef long long ll;  
 9   
10 const int N = 0;  
11 const int MAXNODE = 4000010;  
12   
13 int n, cas;  
14 ll ans;  
15 char str[4001];  
16   
17 struct STrie {  
18     int son[MAXNODE];  
19     int bro[MAXNODE];  
20     int val[MAXNODE];  
21     char ch[MAXNODE];  
22     int sz;  
23   
24     STrie() { sz = 1; ch[0] = val[0] = bro[0] = son[0] = 0; }  
25     void init() { sz = 1; ch[0] = val[0] = bro[0] = son[0] = 0; }  
26     // inline int idx(char c) { return c - 'a'; }  
27       
28     void insert(char *s) {  
29         int len = strlen(s), u = 0, p;  
30         repf (i, 0, len) {  
31             // check the brother of u  
32             for (p = son[u]; p; p = bro[p]) {  
33                 if (ch[p] == s[i])  
34                     break;  
35             }  
36             // cannot find out than insert  
37             if (!p) {  
38                 p = sz++;  
39                 ch[p] = s[i];  
40                 bro[p] = son[u];  
41                 son[p] = 0;  
42                 val[p] = 0;  
43                 son[u] = p;  
44             }  
45             ans += (val[u] - val[p]) * (2 * i + 1);  
46             if (len == i) {  
47                 ans += val[p] * (2 * i + 2);  
48                 val[p]++;  
49             }  
50             val[u]++;  
51             u = p;  
52         }  
53     }  
54 } trie;  
55   
56 int main() {  
57     // ios_base::sync_with_stdio(0);  
58     while (~scanf("%d", &n) && n) {  
59         trie.init();  
60         ans = 0;  
61         repf (i, 0, n - 1) {  
62             scanf("%s", str);  
63             trie.insert(str);  
64         }  
65         printf("Case %d: %lld\n", ++cas, ans);  
66     }  
67     return 0;  
68 } 
copy Code

转载于:https://www.cnblogs.com/cdyboke/p/5015540.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优秀程序员的十个习惯

在这个世界上&#xff0c;有数百万的人热衷于软件开发&#xff0c;他们有很多名字&#xff0c;如&#xff1a;软件工程师&#xff08;Software Engineer&#xff09;&#xff0c;程序员&#xff08;Programmer&#xff09;&#xff0c;编码人&#xff08;Coder&#xff09;&…

如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处

世界上本来没有计算机&#xff0c;工程师创造了它。为了让告诉计算机需要做什么事情&#xff0c;工程师发明了程序设计语言。简单粗暴的编程&#xff1a;C语言&#xff1a;用来学编程&#xff1b;C语言&#xff1a;用来使劲儿学编程&#xff1b;C#&#xff1a;用来在windows操作…

将c程序移植到linux,各位大侠:我把原来在linux运行的c程序移植到HPUNIX上出现了错误...

各位大侠&#xff1a;我把原来在linux运行的c程序移植到HPUNIX上出现了错误(2012-04-11 00:43:47)标签&#xff1a;linuxc程序杂谈各位大侠&#xff1a;我把原来在linux运行的c程序移植到HP_UNIX上出现了错误makefileCC aCC -AA W829 DD64 DAportable-I/ods/app/oracle/produc…

数据库学习建议之提高数据库速度的十条建议

很多网站的重要信息都是保存在数据库中的&#xff0c;用户通过提交访问数据库来获取用户信息。如果数据库速度非常的快&#xff0c;有助于节省服务器的资源&#xff0c;在这篇文章中&#xff0c;我收集了十个优化数据库速度的技巧。0. 小心设计数据库第一个技巧也许看来理所当然…

提高程序员工作效率的11个技巧

“吃苦耐劳”真的是优良品质吗&#xff0c;与你怎么做相比&#xff0c;老板们应该更关心你做了什么、达到的效果。所以&#xff0c;效率&#xff0c;还是效率&#xff0c;希望这些实用小技巧对大家有所帮助。1、两分钟法则如果一件事可以在两分钟内完成&#xff0c;比如回复邮件…

URI和URL及URN的区别

对于URL,大家都比较熟悉&#xff0c;其他两个词就比较陌生了。URI、URL和URN是识别、定位和命名互联网上的资源的标准途径。1989年Tim Berners-Lee发明了互联网&#xff08;World Wide Web&#xff09;。WWW被认为是全球互连的实际的和抽象的资源的集合–它按需求提供信息实体–…

Linux基础-目录与路径

今天我们一起来认识下linux中的目录与路径及操作其的一些常用命令。 说起路径就有绝对与相对之分&#xff0c;虽然简单&#xff0c;我们还是再啰嗦一下&#xff1a; 绝对路径&#xff0c;从系统的根目录/开始的目录都是相对路径&#xff0c;比如/usr/bin、/usr/local 相对路径…

28家知名IT公司名称的由来

28家IT公司名称由来&#xff0c;你知道吗&#xff1f;EMC、VMware、IBM、Oracle、NetApp、Citrix、Cisco、Google、Amazon、Alibaba、UCloud、Tencent、Baidu等著名的存储、备份或云计算行业的IT公司&#xff0c;相信你我都是耳熟能详&#xff0c;但这些公司的名称是如何而来的…

linux创建虚拟声卡,Pear BIOS 安装和配置指引

Pear BIOS 安装指引Pear BIOS是一套硬件模拟系统&#xff0c;操作系统可以在这套模拟硬件上运行。Pear BIOS可以让用户同时安装多套操作系统&#xff0c;使用时可以选择任何一套操作系统启动。在传统电脑系统上&#xff0c;操作系统可以识别并必须识别硬件&#xff1b;而在这套…

关于 ASP.NET 内存缓存你需要知道的 10 点

缓存机制的主要目的是提高应用程序的性能。作为 ASP.NET 开发人员&#xff0c;你可能会意识到 ASP.NET Web 窗体以及 ASP.NET MVC 可以使用 Cache 对象缓存应用程序的数据。这通常被称为服务器端数据缓存&#xff0c;并且常作为框架的内置功能。虽然 ASP.NET Core 中并没有这样…

两张趣图助你理解状态码的含义~

HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器HTTP响应状态的3位数字代码。我们可以通过查看HTTP状态码来判断服务器状态&#xff0c;常见的有404 、502等&#xff1b;但是其他不是很常见的状态码都代表什么状态呢&#xff1f;下面有两张有趣的图片…

产品经理必备神器推荐

欢迎关注我的公众号&#xff08;同步更新文章&#xff09;&#xff1a;DoNet技术分享平台阅读原文工欲善其事&#xff0c;必先利其器&#xff0c;作为最追求极致体验的产品经理群体&#xff0c;手里有一件趁手的法器&#xff0c;工作起来才会有一种享受般的快感&#xff0c;最近…

JS关闭浏览器 (不弹出提示框)

如果网页不是通过脚本程序打开的&#xff08;window.open()&#xff09;&#xff0c;调用window.close()脚本关闭窗口前&#xff0c;必须先将window.opener对象置为null&#xff0c;否则浏览器&#xff08;IE7、IE8&#xff09;会弹出一个确定关闭的对话框。&#xff1c;script…

AM335x(TQ335x)学习笔记——GPIO关键驱动移植

或按照S5PV210学习秩序。我们首先解决的关键问题。TQ335x有六个用户按钮&#xff0c;每个上、下、剩下、对、Enter和ESC。我想开始学习S5PV210当同一&#xff0c;写输入子系统驱动器的关键问题要解决&#xff0c;但浏览driver/input/keyboardgpio-keys.c&#xff0c;大体上看下…

程序员偷偷深爱的9个不良编程习惯

新媒体管家下面这9个编码习惯&#xff0c;虽然在编程规则中是被驳斥的&#xff0c;但我们很多人就是会不由自主地使用它们。我们曾经都做过这样的事情&#xff1a;当妈妈不注意的时候&#xff0c;偷偷地吃糖果零食&#xff0c;然后导致有了蛀牙。同样的&#xff0c;我们都违背过…

emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全

基于 Emacs 的 company 模式并配合 semantic 文法分析器&#xff0c;实现 Emacs 的 C/C 代码自动补全。关于 Emacs 的代码自动补全代码自动补全的功能&#xff0c;对于使用 Emacs 写代码的程序员而言其重要性不言而喻的&#xff0c;但是搜了一些所谓的 “Emacs 完美的 C 自动补…

c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法

要求&#xff1a;从键盘上输入一元二次方程的三个参数&#xff0c;编程判断并求一元二次方程的实根(a,b,c均为整数)算法分析&#xff1a;一元二次方程是只含有一个未知数&#xff0c;且未知数的最高次数是二次的多项式方程。一元二次方程经过整理都可化成一般形式axbxc0(a≠0)&…

程序员如何优雅度过一生的15个建议

首先&#xff0c;我要说明一下精彩的职业生涯应该是什么样。他们不是这样的一个线性图形&#xff0c;不是每过一个月你就会有对应的成长。&#xff08;就算是普通的职业生涯也不会这样。你不会每个月都有提升。每个月你都会变的好一点&#xff0c;但是每次有提升都是大幅度的&a…

cocos2d-x游戏开发 跑酷(四) 关联与物理世界

原创。转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物&#xff0c;可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样&#xff0c;有实际体积&#x…

MyBatis多条件查询

1.MyBatis多条件查询1.1&#xff1a;使用实体类 将参数封装成对象接口&#xff1a;public List<User> getUserListByUser(User user);Mapper映射文件&#xff1a;<select id"getUserListByUser" resultType"User" parameterType"User"…