poj 2945 Find the Clones
https://vjudge.net/problem/POJ-2945
题意:
给出n个长度相同的DNA序列,如果一个DNA序列出现过两次,那么就有说明它被复制了一次。问被复制0次,1次,2次……n-1次的DNA序列分别有多少个。
思路:
可以利用字典树的方法做,用map目测会超时。因为一个字符串是它自己本身的假前缀,所以把每一个字符串的前缀数量-1,就是它被复制的数目。这题学到了一个技巧,统计的时候,已经统计过的要跳开,一开始用map判断超时了,之后想到用sort对char类型的字符串进行排序,但是sort是不能对char的字符串进行排序。但是,我们有结构体啊,把字符串封装在一个结构体中,自己写一个cmp函数就完美的解决了这个问题。这题还是字典树模板用上啦。一定记住最后要释放内存啊。QAQ
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int a[]; const int maxn = ; struct str
{
char s[];
}b[]; bool cmp(str aa,str bb)
{
return strcmp(aa.s,bb.s) < ;
} struct trie
{
trie *next[maxn]; int flag; trie()
{
flag = ;
memset(next,NULL,sizeof(next));
}
}*root; void insert(char *str)
{
int len = strlen(str);
trie *p = root,*q; for (int i = ;i < len;i++)
{
int id = str[i] - 'A'; if (p -> next[id] == NULL)
{
q = new trie();
p -> next[id] = q;
p = p -> next[id];
}
else
{
p = p->next[id]; ++(p->flag);
}
}
} int query(char *str)
{
int len = strlen(str);
trie *p = root; for (int i = ;i < len;i++)
{
int id = str[i] - 'A'; p = p -> next[id]; if (p == NULL) return ;
} return p->flag;
} void Free(trie* t)
{
if (t == NULL) return; for (int i = ;i < maxn;i++)
{
if (t -> next[i]) Free(t->next[i]);
} delete(t);
} int main()
{
int n,m; while (scanf("%d%d",&n,&m) != EOF)
{
if (m == && n == ) break; memset(a,,sizeof(a)); root = new trie(); for (int i = ;i < n;i++)
{
scanf("%s",b[i].s);
insert(b[i].s);
} sort(b,b+n,cmp); //for (int i = 0;i < n;i++)
//printf("%s\n",b[i].s); int rs = query(b[].s); char ss[];strcpy(ss,b[].s); a[rs-]++; for (int i = ;i < n;i++)
{
if (strcmp(ss,b[i].s) == ) continue; strcpy(ss,b[i].s); rs = query(b[i].s); a[rs-]++;
} for (int i = ;i < n;i++)
{
printf("%d\n",a[i]);
} Free(root);
} return ;
}
poj 2945 Find the Clones的更多相关文章
- POJ 2945 trie树
Find the Clones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7704 Accepted: 2879 Descr ...
- poj 2945 trie树统计字符串出现次数
用记录附加信息的val数组记录次数即可. trie的原理:每个可能出现的字目给一个编号c,那么整个树就是一个c叉树 ch[u][c]表示 节点u走c边过去之后的节点 PS:trie树还有种动态写法,使 ...
- 字典树trie的学习与练习题
博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...
- Find the Clones(字典树)
链接:http://poj.org/problem?id=2945 Description Doubleville, a small town in Texas, was attacked by th ...
- POJ2945:Find the Clones——题解
http://poj.org/problem?id=2945 还是trie树……对于结束标记累加并且开个数组记录一下即可. #include<cstdio> #include<cst ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
随机推荐
- 剑指Offer-平衡二叉树
package Tree; /** * 平衡二叉树 * 输入一棵二叉树,判断该二叉树是否是平衡二叉树. * 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法), ...
- js中==和===区别
简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...
- 利用github协作开发步骤
项目使用IDEA开发,IDEA上可以加载很多的插件(而且下载很快),安装github插件,安装git 首先一个成员需要创建好代码库,这个代码库存放项目,所有的开发提交代码都是向这个库提交,在githu ...
- 数据模型LP32 ILP32 LP64 LLP64 ILP64
各个C++实现所选择采用的基础类型的大小统称为"数据模型".有四种广泛采用的数据模型: 32 位系统: LP32 或 2/4/4(int 为 16-bit,long 和指针为 32 ...
- Day3---------Linux操作系统
---恢复内容开始--- 网络基础和DOS命令 一.网络分类 1.地理位置 1).局域网(LAN) 2).城域网(MAN) 3).广域网(WAN) 2.传输介质 1).有线网 2).光纤网 3).无线 ...
- 在linux下如何使用yum查看安装了哪些软件包
$yum list installed //列出所有已安装的软件包 yum针对软件包操作常用命令: 1.使用YUM查找软件包 命令:yum search 2.列出所有可安装的软件包 命令:yum li ...
- 云计算 --> 三种服务模式IaaS,PaaS,SaaS
三种服务模式IaaS,PaaS,SaaS “云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务.任何一个使用基于互联网的方法来计算,存储和开 ...
- ASP.NET Core原理概述
ASP.NET Core 是一个控制台应用程序,在其 main 方法中创建一个Web服务器,以下是program.cs中的代码: using Microsoft.AspNetCore; using M ...
- Oracle之SQL优化专题01-查看SQL执行计划的方法
在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...
- Spring MVC之适配器的获取及执行(RequestMappingHandlerAdapter)
首先看下doDispatch()方法如何找到适合的适配器来执行方法的: protected HandlerAdapter getHandlerAdapter(Object handler) throw ...