Find the Clones(字典树)
链接:http://poj.org/problem?id=2945
Description
the victims, and released multiple copies of them back in Doubleville. So now it might happen that there are 6 identical person named Hugh F. Bumblebee: the original person and its 5 copies. The Federal Bureau of Unauthorized Cloning (FBUC) charged you with
the task of determining how many copies were made from each person. To help you in your task, FBUC have collected a DNA sample from each person. All copies of the same person have the same DNA sequence, and different people have different sequences (we know
that there are no identical twins in the town, this is not an issue).
Input
each line contains a sequence of m characters, where each character is either `A', `C', `G' or `T'.
The input is terminated by a block with n = m = 0 .
Output
only once (i.e., there are two identical copies for each such person.) The third line contains the number of people that are present in three identical copies, and so on: the i -th line contains the number of persons that are present in i identical copies.
For example, if there are 11 samples, one of them is from John Smith, and all the others are from copies of Joe Foobar, then you have to print `1' in the first andthe tenth lines, and `0' in all the other lines.
Sample Input
9 6
AAAAAA
ACACAC
GTTTTG
ACACAC
GTTTTG
ACACAC
ACACAC
TCCCCC
TCCCCC
0 0
Sample Output
1
2
0
1
0
0
0
0
0
Hint
Huge input file, 'scanf' recommended to avoid TLE.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstdio>
#include <algorithm>
using namespace std;
#define rd(x,y) scanf("%d%d",&x,&y)
int n,m;
struct Trie
{
int cnt;//有多少单词经过该节点
Trie *next[4];
Trie()
{
cnt=0;
for(int i=0;i<4;i++)
next[i]=NULL;
}
}; int coun[20005];
void create(char *s,Trie * root)//将字符串s建立在trie树中
{
Trie *p=root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id = -1;
switch(s[i]){
case 'A' : id=0;break;
case 'G' : id=1;break;
case 'C' : id=2;break;
case 'T' : id=3;break;
}
// cout<<id<<' ';
if(p->next[id]==NULL)
{
p->next[id]=new Trie;
p->next[id]->cnt++;
}
else
p->next[id]->cnt++;
p=p->next[id];
}
} void searchTrie(Trie *r,int temp)//查找字符串s是多少单词的前缀。 {
Trie *p=r;
for(int i=0; i<4; i++)
if(p->next[i]!=NULL)
searchTrie(p->next[i],temp+1);
if(temp == m)
coun[(p->cnt)-1]++;
} void release(Trie *r)//释放空间(该题中可以不用释放,也能过)
{
if(r==NULL) return ;
for(int i=0; i<4; i++)
{
if(r->next[i]!=NULL)
release(r->next[i]);
}
// if(r!=&root)
free(r);
}
int main()
{
while(~rd(n,m)&&n!=0&&m!=0)
{
Trie root;
memset(coun,0,sizeof(coun));
char s[25];
getchar();
for(int i = 0;i < n ;i++)
{
gets(s);
create(s,&root);//根据给定的字符串建立字典树
}
searchTrie(&root,0); for(int i = 0 ;i<n;i++)
printf("%d\n",coun[i]);
release(&root);
// root.next[0]=root.next[1]=root.next[2]=root.next[3]=NULL;
}
return 0;
}
Find the Clones(字典树)的更多相关文章
- POJ2945(Find the Clones)--字典树,map
题意:给你n个规定长度的单词,问你其中出现了1次的单词,出现两次的单词...出现n次单词分别有多少个. 当然这题map也能过,但是这里介绍字典树的做法. 首相对于n个单词存入树中,当然建树过程中遇到一 ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
- 字典树+博弈 CF 455B A Lot of Games(接龙游戏)
题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...
- 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- 山东第一届省赛1001 Phone Number(字典树)
Phone Number Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 We know that if a phone numb ...
- 字典树 - A Poet Computer
The ACM team is working on an AI project called (Eih Eye Three) that allows computers to write poems ...
- trie字典树详解及应用
原文链接 http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用 一.知识简介 ...
- HDU1671 字典树
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- android 完全退出应用程序(重要)
android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个A ...
- apache commons vfs 文件夹监控
package test.vfs; import java.io.File; import org.apache.commons.logging.Log; import org.apache.comm ...
- Java Dns Cache Manipulator
通过代码直接设置Java的DNS(实际上设置的是DNS Cache),支持JDK 6+. 功能 设置/重置DNS(不会再去Lookup DNS) 可以设置单条 或是通过Properties文件批量设 ...
- VLOOKUP 函数
如果需要在表格或区域中按行查找内容,可使用 VLOOKUP,它是一个查找和引用函数.例如,按部件号查找汽车部件的价格. =VLOOKUP(要查找的值.要在其中查找值的区域.区域中包含返回值的列号.精确 ...
- CSS Margin外边距合并
应该知道这点东西的!!! 可是偏偏记不住! 外边距合并会发生在以下两种情况下: 1 垂直出现的两个拥有外边距的块级元素. div1 { margin-bottom: 20px; } div2 { ma ...
- 06文件与IO
这节主要学习系统调用stat.lstat.fstat. 格式如下: int fstat(int filedes, struct stat *buf); int stat(const char *pat ...
- 域控制器中的FSMO角色
FSMO是Flexible single master operation的缩写,意思就是灵活单主机操作.营运主机(Operation Masters,又称为Flexible Single Maste ...
- 进程间通信IPC之--共享内存
每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...
- ASP.NET运行机制原理
ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...
- Hadoop使用lzo压缩格式
在hadoop中搭建lzo环境: wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz export CFLAGS ...