博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
csu 1987: 绚丽的手链
阅读量:7089 次
发布时间:2019-06-28

本文共 2397 字,大约阅读时间需要 7 分钟。

      Time Limit: 6 Sec     Memory Limit: 512 Mb     Submitted: 13     Solved: 2    


Description

小X的妹妹马上就要过生日了,作为哥哥,小X打算买一些手链送给妹妹。

采购完礼物回到家的小X惊奇的发现:每条手链虽然只由两种颜色的珠子串成,但是它们有一个神奇的效果,那就是当多条手链同时放在一起时,会散发出绚丽夺目的光芒。光芒的绚丽程度有强有弱,这取决于手链的最长公共前缀的长度和手链数目的乘积。例如000,001,0011三串手链放在一起会发出绚丽程度为6的光芒。

显然如果将所有手链都送给妹妹,效果未必最好,因此他决定从中挑选一些送给妹妹,使得能够达到最绚丽的效果。你能帮助他吗?

Input

第一行一个整数 T (≤ 20) 表示数据组数。

每组数据第一行一个整数 n(≤ 50000) 代表字符串的数量。接下来N行,每行为一个仅由0,1组成的字符串代表小X购买的手链,手链的最大长度为200。

Output

对于每组数据输出一行, 表示小X经过挑选后送给妹妹的手链所能产生的最大绚丽程度。

Sample Input

4400000001101010102010100101010101010101101001010101010101030101010101010000100010100101010101010000100010000101010101010000100010105010101010101000010100100101001010101010101010000101001101010101000001010101010110101000101010101101010100010101010101001

Sample Output

6206644

Hint

Source

2017年暑期集训校队选拔

Author

徐戍

 

 

题解:

这个题目是真的不好做    心累

6次超时   还有几次其他的错误    

我的第一想法就是   构建字典树  节点记录下着是几个字符串的公共子串   (这个不难)  然后就是一次遍历字典树   求出答案   结果超时

然后  我发现建树之后其实不用去遍历了    我们在建树的时候   就可以得到答案    结果还是超时

下面的超时的那个代码    各位大佬谁会优化的   告诉一下我怎么优化   0.0    (后面有AC代码)

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 char s[205]; 9 int ans;10 struct Trie11 {12 int num;13 struct Trie *nxt[2];14 Trie()15 {16 num=0;17 for(int i=0; i<2; i++)18 {19 nxt[i]=NULL;20 }21 }22 };23 24 void Trie_Inser(Trie *p,char s[])25 {26 int i=0;27 Trie *q=p;28 while(s[i])29 {30 int nx=s[i]-'0';31 if(q->nxt[nx]==NULL)32 {33 q->nxt[nx]=new Trie;34 }35 i++;36 q=q->nxt[nx];37 q->num++;38 ans=max(ans,(q->num)*i);39 }40 }41 int main()42 {43 int n,m;44 scanf("%d",&n);45 while(n--)46 {47 ans=0;48 Trie *p=new Trie;49 scanf("%d",&m);50 getchar();51 while(m--)52 {53 gets(s);54 Trie_Inser(p,s);55 }56 57 printf("%d\n",ans);58 59 }60 return 0;61 }

 

 

在我觉得动态字典树的做法没有救了之后    我尝试了一下动态字典树的    说的简单点就是使用数组去模拟   

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 int pos,ans; 7 struct node 8 { 9 int num;10 int child[2];11 }tree[10000010];12 13 int add()14 {15 pos++;16 tree[pos].num=0;17 for(int i=0;i<2;i++)18 {19 tree[pos].child[i]=-1;20 }21 return pos;22 }23 24 int inser(char* str)25 {26 int post=0;27 int tmp=0;28 int len=strlen(str);29 for(int i=0;i

 

转载于:https://www.cnblogs.com/52why/p/7460121.html

你可能感兴趣的文章
《Spring攻略(第2版)》——1.11 用XML配置自动装配Bean
查看>>
真的超赞!用systemd命令来管理linux系统!
查看>>
Tomcat7.0.26的连接数控制bug的问题排查
查看>>
《移动网页设计与开发 HTML5+CSS3+JavaScript》—— 2.4 微格式
查看>>
《面向机器智能的TensorFlow实践》安装TensorFlow10
查看>>
《你必须知道的495个C语言问题》一第1章 声明和初始化(1.1-1.20)
查看>>
如何在 Ubuntu 上安装 FireFox 15
查看>>
SQL Server FullText解决Like字句性能问题
查看>>
Ceph实验室:第五课:Ceph运维之换盘
查看>>
C++实践参考——复数类中的运算符重载
查看>>
【Spark Summit East 2017】为了乐趣和利润的全球扩张
查看>>
Rss订阅
查看>>
Mac - gdb配置
查看>>
Vuejs——(4)v-if、v-for
查看>>
让Spark成为你的瑞士军刀
查看>>
[LeetCode]--40. Combination Sum II
查看>>
ART世界探险(16) - 快速编译器下的方法编译
查看>>
多线程常用方法 sleep wait join等以及对锁的控制
查看>>
Redis学习笔记
查看>>
主机无法访问虚拟机的apache解决办法
查看>>