csu 1987: 绚丽的手链
1987: 绚丽的手链
Submit Page Summary 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
4
4
0000
0001
10101
010
2
01010010101010101010
11010010101010101010
3
010101010101000010001010
010101010101000010001000
010101010101000010001010
5
01010101010100001010010010100101
01010101010100001010011010101010
00001010101010110101
0001010101011010101
00010101010101001
Sample Output
6
20
66
44
Hint
Source
2017年暑期集训校队选拔
Author
徐戍
题解:
这个题目是真的不好做 心累
6次超时 还有几次其他的错误
我的第一想法就是 构建字典树 节点记录下着是几个字符串的公共子串 (这个不难) 然后就是一次遍历字典树 求出答案 结果超时
然后 我发现建树之后其实不用去遍历了 我们在建树的时候 就可以得到答案 结果还是超时
下面的超时的那个代码 各位大佬谁会优化的 告诉一下我怎么优化 0.0 (后面有AC代码)
#include <cstdio>
#include <time.h>
#include <cmath>
#include <map>
#include <stdlib.h>
#include <cstring>
using namespace std;
char s[];
int ans;
struct Trie
{
int num;
struct Trie *nxt[];
Trie()
{
num=;
for(int i=; i<; i++)
{
nxt[i]=NULL;
}
}
}; void Trie_Inser(Trie *p,char s[])
{
int i=;
Trie *q=p;
while(s[i])
{
int nx=s[i]-'';
if(q->nxt[nx]==NULL)
{
q->nxt[nx]=new Trie;
}
i++;
q=q->nxt[nx];
q->num++;
ans=max(ans,(q->num)*i);
}
}
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
ans=;
Trie *p=new Trie;
scanf("%d",&m);
getchar();
while(m--)
{
gets(s);
Trie_Inser(p,s);
} printf("%d\n",ans); }
return ;
}
在我觉得动态字典树的做法没有救了之后 我尝试了一下动态字典树的 说的简单点就是使用数组去模拟
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std;
int pos,ans;
struct node
{
int num;
int child[];
}tree[]; int add()
{
pos++;
tree[pos].num=;
for(int i=;i<;i++)
{
tree[pos].child[i]=-;
}
return pos;
} int inser(char* str)
{
int post=;
int tmp=;
int len=strlen(str);
for(int i=;i<len;i++)
{
int m=str[i]-'';
if(tree[post].child[m]==-)
{
if(tmp==)
tmp=i+;
tree[post].child[m]=add();
} post=tree[post].child[m];
tree[post].num++;
ans=max(ans,tree[post].num*(i+));
}
if(!tmp)
tmp=len;
return tmp;
} char arr[];
int main()
{
int T;
scanf("%d",&T);
for(int t=;t<=T;t++)
{
int n;
pos=;
memset(tree[].child,-,sizeof(tree[].child));
scanf("%d",&n);
ans=;
for(int i=;i<n;i++)
{
scanf("%s",&arr);
int k=inser(arr);
}
cout<<ans<<endl;
}
return ;
}
csu 1987: 绚丽的手链的更多相关文章
- csu 1812: 三角形和矩形 凸包
传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************** ...
- CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这 ...
- CSU 1120 病毒(DP)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120 解题报告:dp,用一个串去更新另一个串,递推方程是: if(b[i] > a ...
- CSU 1116 Kingdoms(枚举最小生成树)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只 ...
- CSU 1113 Updating a Dictionary(map容器应用)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...
- CSU 1333 Funny Car Racing (最短路)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333 解题报告:一个图里面有n个点和m条单向边,注意是单向边,然后每条路开a秒关闭b秒 ...
- CSU 1337 搞笑版费马大定理(2013湖南省程序设计竞赛J题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1337 解题报告:虽然x和y的范围都是10^8,但是如果a 是大于1000的话,那么a^3 ...
- CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ...
- 三分 --- CSU 1548: Design road
Design road Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1548 Mean: 目的:从(0,0)到 ...
随机推荐
- iptables 规则学习
iptables 一共有 3 张表:mangle,nat,filter mangle 表主要处理 ttl,tos,mark 等信息(进) filter 顾名思义就是过滤器,用作防火墙(出) nat 主 ...
- jvm 堆栈概念
关于JVM的工作原理以及调优是一个向往已久的模块,终于有幸接触到:http://pengjiaheng.iteye.com/blog/518623 那就顺着这个思路,来梳理一下自己看到后的结论和感想. ...
- linux 读取文件
linux读取文件是经常要用到的操作,以下示例(说明看注释): #读取文件snlist.txt中的每一行内容赋给sn变量 while read sn do echo ">>> ...
- HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...
- /proc/pid/statm content analysis
root@am335x-ec:/# cat /proc/1/statm 6141 1181 699 232 0 4641 0 Table 1-3: Contents of the statm file ...
- CLR 调试体系结构
公共语言运行时 (CLR) 调试 API 专门用作操作系统内核的一部分. 在非托管代码中,当程序生成异常时,内核将暂停执行进程,并使用 Win32 调试 API 将异常信息传递给调试器. CLR 调试 ...
- bootstrap轮播图组件
一.轮播图组件模板(官方文档) <div id="carousel-example-generic" class="carousel slide" dat ...
- 【luoguP2997】[USACO10NOV]旗帜Banner
题目链接 长和宽的gcd(x,y)=1,就没有中间结点,一种线段有两种方向,暴力统计一下就好了 注意x=0或y=0时的线段只有一种方向 #include<iostream> #includ ...
- GoCN每日新闻(2019-10-17)
GoCN每日新闻(2019-10-17) 通过go module管理go tool https://marcofranssen.nl/manage-go-tools-via-go-modules/ 使 ...
- GitHub 远程仓库 de 第一次配置
GitHub远程仓库, Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.首先找一台电脑充当服务器的角色, 每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上 ...