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 ...
随机推荐
- AngularJS_对象数组-filter-orderBy
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 阿里DNS
二.阿里公共DNS http://www.alidns.com 全球统一服务ip: 223.5.5.5 223.6.6.6
- DW(三):polybase基本理论
PolyBase is a technology that accesses and combines(整合) both non-relational and relational data, all ...
- js调用ajax
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SPOJ #4 Transform the Expression
Not hard to know it is simply transform from in-order to post-order.My first idea is to build a tree ...
- js常用方法收集
JS获取地址栏制定参数值: //获取URL参数的值 function getUrlParam(name){ var reg = new RegExp("(^|&)"+ na ...
- 几个关于wcf、rest服务的好帖子
//http://blog.csdn.net/fangxing80/article/details/6247297 //http://msdn.microsoft.com/zh-cn/magazin ...
- HDMI EDID解读
现在的显示设备比如显示器,电视等都HDMI接口,那通常每个HDMI接口都保留有一份EDID数据,这个数据可以存在程序里面由系统启动过程中来初始化,更常见的做法是每个HDMI口会有一个EEPROM来保存 ...
- 【mongodb系统学习之十二】mongodb修改数据(一)
十二.mongodb修改数据:update 1).修改数据库数据:update:语法 db.collectionName.update({},{},boolean,boolean): 2).updat ...
- 尽量采用as操作符而不是旧式C风格做强制类型转换
http://www.cnblogs.com/JiangSoney/archive/2009/08/07/1541488.html MSDN: https://msdn.microsoft.com/z ...