Find the Clones

Time Limit: 5000MS Memory Limit: 65536K

Total Submissions: 7704 Accepted: 2879

Description

Doubleville, a small town in Texas, was attacked by the aliens. They have abducted some of the residents and taken them to the a spaceship orbiting around earth. After some (quite unpleasant) human experiments, the aliens cloned 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

The input contains several blocks of test cases. Each case begins with a line containing two integers: the number 1 ≤ n ≤ 20000 people, and the length 1 ≤ m ≤ 20 of the DNA sequences. The next n lines contain the DNA sequences: each line contains a sequence of m characters, where each character is either A',C’, G' orT’.

The input is terminated by a block with n = m = 0 .

Output

For each test case, you have to output n lines, each line containing a single integer. The first line contains the number of different people that were not copied. The second line contains the number of people that were copied 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, and0’ 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.

题意:给出x个字符串,问你i个(i<=i<=x)相同字符串的个数,然后输出第i行代表有i个相同字符串的个数。

思路: 找的trie树题,自然就是trie树啦。好像别人有直接strcmp+sort+O(n)扫一遍过的,有用map过的,还有用hash的(Hash好像很有用的样子)。

第一次提交,,,

#include <cstdio>
#include <cstring>
using namespace std;
int x,y;
int a[20005];
struct trie
{
int cnt;
trie *next[26];
};
trie *root=new trie;
void insert(char ch[])
{
trie *p=root,*newtrie;
for(int i=0;ch[i]!='\0';i++)
{
if(p->next[ch[i]-'A']==0)
{
newtrie=new trie;
for(int j=0;j<26;j++) newtrie->next[j]=NULL;
newtrie->cnt=0;
p->next[ch[i]-'A']=newtrie;
p=newtrie;
}
else
p=p->next[ch[i]-'A'];
}
p->cnt++;
a[p->cnt]++;
a[p->cnt-1]--;
}
int main()
{
char ch[29];
while(scanf("%d%d",&x,&y)&&x)
{
for(int i=0;i<26;i++) root->next[i]=NULL;
root->cnt=0;
for(int i=1;i<=x;i++)
{
scanf("%s",ch);
insert(ch);
}
for(int i=1;i<=x;i++)
printf("%d\n",a[i]);
for(int i=0;i<=x;i++)a[i]=0;
}
}



分析了一下原因,没有拆树导致用过了废了的内存没有回收

改了五分钟以后,第二版提交。

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int x,y;
int a[20005];
struct trie
{
int cnt;
trie *next[26];
};
trie *root=new trie;
void insert(char ch[])
{
trie *p=root,*newtrie;
for(int i=0;ch[i]!='\0';i++)
{
if(p->next[ch[i]-'A']==0)
{
newtrie=new trie;
for(int j=0;j<26;j++) newtrie->next[j]=NULL;
newtrie->cnt=0;
p->next[ch[i]-'A']=newtrie;
p=newtrie;
}
else
p=p->next[ch[i]-'A'];
}
p->cnt++;
a[p->cnt]++;
a[p->cnt-1]--;
}
void dfs(trie *p)
{
for(int i=0;i<26;i++)
{
if(p->next[i]!=NULL) dfs(p->next[i]);
free(p->next[i]);
}
}
int main()
{
char ch[29];
while(scanf("%d%d",&x,&y)&&x)
{
for(int i=0;i<26;i++) root->next[i]=NULL;
root->cnt=0;
for(int i=1;i<=x;i++)
{
scanf("%s",ch);
insert(ch);
}
for(int i=1;i<=x;i++)
printf("%d\n",a[i]);
for(int i=0;i<=x;i++)a[i]=0;
dfs(root);
}
}

还是很慢啊! 4.5s,19216K的memory。

POJ 2945 trie树的更多相关文章

  1. poj 2945 trie树统计字符串出现次数

    用记录附加信息的val数组记录次数即可. trie的原理:每个可能出现的字目给一个编号c,那么整个树就是一个c叉树 ch[u][c]表示 节点u走c边过去之后的节点 PS:trie树还有种动态写法,使 ...

  2. POJ 3630 trie树

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26559 Accepted: 8000 Descripti ...

  3. POJ 2513 trie树+并查集判断无向图的欧拉路

    生无可恋 查RE查了一个多小时.. 原因是我N define的是250500 应该是500500!!!!!!!!! 身败名裂,已无颜面对众人.. 吐槽完了 我们来说思路... 思路: 判有向图能否形成 ...

  4. hdu 1671&& poj 3630 (trie 树应用)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25280   Accepted: 7678 Descr ...

  5. poj 2513 Colored Sticks (trie 树)

    链接:poj 2513 题意:给定一些木棒.木棒两端都涂上颜色,不同木棒相接的一边必须是 同样的颜色.求能否将木棒首尾相接.连成一条直线. 分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点 ...

  6. POJ 3630 Phone List(trie树的简单应用)

    题目链接:http://poj.org/problem?id=3630 题意:给你多个字符串,如果其中任意两个字符串满足一个是另一个的前缀,那么输出NO,否则输出YES 思路:简单的trie树应用,插 ...

  7. POJ 3764 The xor-longest Path trie树解决位运算贪心

    http://poj.org/problem?id=3764 题意 :  一颗树,每个边有个值,在树上找一条简单路径,使得这条路径上的边权异或值最大 先找到所有节点到一点的距离 , 显然dis( x ...

  8. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  9. [ACM] POJ 2418 Hardwood Species (Trie树或map)

    Hardwood Species Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 17986   Accepted: 713 ...

随机推荐

  1. zabbix--TCP状态监控

    Tcp的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB:或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击(例如SYN攻击),或是是time_wait值比 ...

  2. DOCKER - 容器抓包

    https://help.aliyun.com/knowledge_detail/40564.html?spm=a2c4e.11153940.blogcont272172.10.b09e28a6AOd ...

  3. [Luogu] P1233 木棍加工

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...

  4. 1.git上手篇总结

    阅读 Git 原理详解及实用指南 记录 上手 1: Git 的最基本的工作模型 从 GitHub 把中央仓库 clone 到本地(使用命令: git clone) 把写完的代码提交(先用 git ad ...

  5. 【POJ 1860】Currency Exchange

    [题目链接]:http://poj.org/problem?id=1860 [题意] 给你n种货币,m种货币之间的交换信息; 交换信息以 A,B,RA,CA,RB,CB的形式给出; 即A换B的话假设A ...

  6. 洛谷 P2155 BZOJ 2186 codevs 2301 [SDOI2008]沙拉公主的困惑

    题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...

  7. [luoguP2342] 叠积木(并查集)

    传送门 up[i] 表示一个木块上面有多少个 all[i] 表示整个连通块内有多少个 那么 一个木块下面的木块个数为 all[root[i]] - up[i] - 1 注意:up[i] 可以在 fin ...

  8. 使用外部LDAP用户认证后,DJANGO用户如何作登陆的操作?

    公司的要求,使用公司的UM帐号验证密码,然后,在DJANGO里登陆. 因为没有authenticate函数,只有login函数,所以不能简单的使用用户来login,而需要加一个backend参数... ...

  9. HDU 5242 上海大都会 G题

    这道题其实是求K条最长的不重叠的链.贪心算法+DFS即可求.深度优先搜索时,返回当前子树的最长链,使用优先队列保存其他孩子结点的最长链,即可.求结果时只需从优先队列中取前K个值的和.这相当于暴力删除每 ...

  10. 从头认识java-15.6 队列(Queue)

    这一章节我们来讨论一下队列(Queue). 1.什么是队列? 队列是一种特殊的线性表,特殊之处在于它仅仅同意在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样.队列是 ...