BZOJ 1174: [Balkan2007]Toponyms
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 735 Solved: 102
[Submit][Status][Discuss]
Description
给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化.
Input
第一行给出数字N.N在[2,1000000] 下面N行描述这些字符串,长度不超过20000 。保证输入文件不超过10MB
Output
a single line with an integer representing the maximal level of complexity Lc(T).
Sample Input
Jora de Sus
Orhei
Jora de Mijloc
Joreni
Jora de Jos
Japca
Orheiul Vechi
Sample Output
HINT
这题有毒啊,,
思路和算法没什么好说的,
就是建一棵字典树,统计好深度和个数,然后乘起来,取最大值
但是!!!
本蒟蒻一开始写的无限RE
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,sz=,ans;
string ch;
int a[][],f[];
void insert()
{
int l=ch.length(),now=;
for(int i=;i<l;i++)
{
int t;
if(ch[i]==' ')t=;
else if(ch[i]<='Z')t=ch[i]-'A';
else t=ch[i]-'a'+;
if(a[now][t])now=a[now][t];
else now=a[now][t]=++sz;
f[now]++;
ans=max(ans,f[now]*(i+));
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
getline(cin,ch);
insert();
}
printf("%d",ans);
return ;
}
RE
后来听别人说这题卡内存,
于是我换成了前向星储存,
然后,
无限TLE,
加了各种常数优化还是无限TLE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=;
inline void read(int &n)
{
char c='+';bool flag=;n=;
while(c<''||c>''){c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')n=n*+c-,c=getchar();
}
struct E
{
int u,v,nxt;
}edge[MAXN];
int head[MAXN];
int num=;
struct node
{
int bh;
int num;
int val;
node(){num=;val=;}
}trie[MAXN];
int tot=;
char a[MAXN];
bool vis[MAXN];
inline void add_edge(int x,int y)
{
edge[num].u=x;
edge[num].v=y;
edge[num].nxt=head[x];
head[x]=num++;
}
long long int ans=;
inline void insert(char *a)
{
int l=strlen(a);int now=;
for(register int i=;i<l;i++)
{
bool flag=;
int debug=a[i];
for(register int j=head[now];j!=-;j=edge[j].nxt)
{
if(trie[edge[j].v].val==a[i])
trie[edge[j].v].num++,
flag=,
now=edge[j].v;
}
if(flag==)
{
trie[++tot].bh=tot;
trie[tot].num=;
trie[tot].val=a[i];
add_edge(now,tot);
now=tot;
}
ans=max(ans,(long long )(i+)*trie[now].num);
}
}
int main()
{
memset(head,-,sizeof(head));
int n;
read(n);
for(int i=;i<=n;i++)
{
memset(a,,sizeof(a));int hh=;
char ch=getchar();bool flag2=;
while(ch=='\n') ch=getchar();
while(ch!='\n')
a[hh++]=ch,ch=getchar();
insert(a);
}
printf("%lld",ans);
return ;
}
TLE
然后只好参考别的大神的代码.......
编译速度就秒杀我的代码。。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 5000010
using namespace std;
int tot = , head[N] , to[N] , next[N] , cnt , si[N];
char val[N];
void add(int x , int y , char c)
{
to[++cnt] = y , val[cnt] = c , next[cnt] = head[x] , head[x] = cnt;
}
int main()
{
int n , i , j , k , t , p;
char ch;
long long ans = ;
scanf("%d" , &n);
for(i = ; i <= n ; i ++ )
{
ch = getchar();
while(ch == '\n') ch = getchar();
for(j = t = ; ch != '\n' ; j ++ , ch = getchar())
{
for(p = , k = head[t] ; k ; k = next[k])
{
if(val[k] == ch)
{
p = to[k];
break;
}
}
if(!p) add(t , p = ++tot , ch);
t = p , si[t] ++ , ans = max(ans , (long long)j * si[t]);
}
}
printf("%lld\n" , ans);
return ;
}
BZOJ 1174: [Balkan2007]Toponyms的更多相关文章
- BZOJ 1174 [Balkan2007]Toponyms(Trie)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1174 [题目大意] 选出一些字符串,使得字符串的最长公共前缀*字符串的总个数最大化 [ ...
- BZOJ1174: [Balkan2007]Toponyms
1174: [Balkan2007]Toponyms Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 117 Solved: 16[Submit][S ...
- BZOJ 1176: [Balkan2007]Mokia
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2012 Solved: 896[Submit][St ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 1176([Balkan2007]Mokia-CDQ分治-分治询问)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 185 Solved: 94 [ Submit] ...
- 【BZOJ1174】: [Balkan2007]Toponyms
→原题← ↑这样子我就不复制题面啦~ 就是一题很裸的字典树而已,不过空间卡的很死,直接开个数组 tr[N][52] 什么之类的一定会RE的(惨痛的教训) 当字典树空间不够而时间限制又比较宽松时,我们可 ...
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ...
- BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
[题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
随机推荐
- 从字节码指令看重写在JVM中的实现
Java是解释执行的.包含动态链接的特性.都给解析或执行期间提供了非常多灵活扩展的空间.面向对象语言的继承.封装和多态的特性,在JVM中是怎样进行编译.解析,以及通过字节码指令怎样确定方法调用的版本号 ...
- 通过 KVM+virt-manager配置双屏虚拟机(两套键盘。鼠标)
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- githubclient配置方法简述
/*********************************************************** * Author : Samson * Date : 08/15/2015 * ...
- CF 447B(DZY Loves Strings-贪心)
B. DZY Loves Strings time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 如何比较Keras, TensorLayer, TFLearn ?——如果只是想玩玩深度学习,想快速上手 -- Keras 如果工作中需要解决内部问题,想快速见效果 -- TFLearn 或者 Tensorlayer 如果正式发布的产品和业务,自己设计网络模型,需要持续开发和维护 -- Tensorlayer
转自:https://www.zhihu.com/question/50030898/answer/235137938 如何比较Keras, TensorLayer, TFLearn ? 这三个库主要 ...
- Array数组的排序与二分查字法
import java.util.Arrays; public class sort { public static void main(String[] args) { // TODO 自动生成的方 ...
- ios上有时候提交按钮点击两次才可以取消输入框软键盘
ios上有时候提交按钮点击两次才可以取消输入框软键盘,点击第一次软键盘消失,点击第二次输入框页面消失,这样用户体验不好.我的做法是用 touchstart 代替click来处理 反应快,但是有时候会出 ...
- sqlserver如何给某一用户分配只能查看某一视图的权限
exec sp_addrole 'guestview' --GRANT SELECT ON veiw TO [guestview]; GRANT SELECT ON CustomerInfo TO ...
- MyBatis数据持久化(六)resultMap使用
resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...
- 批量kill 某个用户session
SELECT 'alter system kill session '''||SID || ',' || SERIAL#||''';' FROM V$SESSION where username ...