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)到 ...
随机推荐
- Laravel —— batch 实现
很多项目中会用到自动执行脚本的功能, 例如,自动统计上个月的注册用户,定时生成 csv 文件并邮箱发送给客户等等. Laravel 中的任务调度,可实现定时任务, 结合自定义 artisan 命令,即 ...
- js 键盘事件(onkeydown、onkeyup、onkeypress)
onkeypress 这个事件在用户按下并放开任何字母数字键时发生.系统按钮(例如,箭头键和功能键)无法得到识别. onkeyup 这个事件在用户放开任何先前按下的键盘键时发生. onkeydown ...
- web开发——文件的上传和下载
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...
- B/S之大文件分段上传、断点续传
4GB以上超大文件上传和断点续传服务器的实现 随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上 ...
- learning java FileInputStream
public class FileInputStreamTest { public static void main(String[] args) throws IOException { var f ...
- 捷配制作PCB流程
https://www.jiepei.com/orderprocess.html 以我的板子为例 查看下自己板子的信息 切换到mm 键盘 Q 压缩PCB文件 付款什么的自己哈 改天我有贴片的订单的时候 ...
- 用Python操作MySQL(pymysql)
用python来操作MySQL,首先需要安装PyMySQL库(pip install pymysql). 连接MySQL: import pymysql connect=pymysql.connect ...
- 区间DP训练
一.石子合并 问题描述 将 n (\(1 \le n \le 200\))堆石子绕圆形操场摆放,现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并 ...
- MongoDB 数据库创建删除
在MongoDB数据库里面是存在有数据库的概念,但是没有模式(所有的信息都是按照文档保存的),保存数据的结构就是JSON结构,只不过在进行一些数据处理的时候才会使用到MongoDB自己的一些操作符号 ...
- java生成HMACSHA256的方法
data要加密的数据,key密钥 public static String HMACSHA256(String data, String key) throws Exception { Mac sha ...