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 ...
随机推荐
- 数据库入门之运行原始 SQL 查找
数据库入门之运行原始 SQL 查找 一旦你设置好了数据库连接,就可以使用 DB facade 来进行查找.DB facade 提供每个类型的查找方法:select.update.insert.dele ...
- vue的图片上传
转载 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 深入java虚拟机学习 -- 内存管理机制
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...
- 笔记:MyBatis XML配置-typeAliases 内建别名表
别名 映射的类型 _byte byte _long long _short short _int int _integer int _double double _float float _boole ...
- 基于hi-nginx的web开发(python篇)——起步
hi-nginx不仅让python web 应用跑得飞快,而且让相关开发变得简单敏捷. 关于hi-nginx的安装,请参考:https://www.cnblogs.com/hi-nginx/p/862 ...
- 网络通信 --> 互联网协议(一)
互联网协议 一.概述 如何分层有不同的模型,有的模型分七层,有的分四层.这里介绍把互联网分成五层. 最底下的一层叫做"实体层"(Physical Layer),最上面的一层叫做&q ...
- 生产者/消费者问题的多种Java实现方式
实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...
- 开始补习JavaScript的第一天
JavaScript介绍: ①.JavaScript是一种解释性的,基于对象的脚本语言. ②.JavaScript是一种轻量级的编程语言,可以嵌入到html页面中,由浏览器来解释执行. ③.JavaS ...
- 关于Redis数据库 ---- 基础篇
Redis数据库也被称为数据结构数据库,因为存储基于key-value模式. 其中,value值可以为字符串(string),哈希(map),列表(list),集合(set)和有序集合(zset). ...
- [日常] Codeforces Round #441 Div.2 实况
上次打了一发 Round #440 Div.2 结果被垃圾交互器卡掉 $200$ Rating后心情复杂... 然后立了个 Round #441 要翻上蓝的flag QAQ 晚饭回来就开始搞事情, 大 ...