题目描述
达波维尔,田纳西洲的一个小镇,遭到了外星人的进攻。外星人绑架了一些当地的居民并把他们带到了外星飞船上。在飞船上,外星人通过克隆技术复制了其中一些居民,然后把这些克隆人连通被绑架的居民一起放回到了达波维尔。现在的情况是,有可能有6个一模一样的人名字都叫“Hugh F. Bumblebee”,其中有5个都是克隆人。“不明克隆调查局”(FBUC)派遣你去调查该镇的每个人有多少个复制品。为了帮助你调查,FBUC给你提供了一份该镇居民的DNA样本。不同的人有着不同的DNA序列,但是克隆人跟本人有着相同的DNA。
输入格式
输入中包含有若干组测试数据,对于每组测试数据:
第一行,两个整数n和m,表示总共有n个人,每个人的DNA序列长度为m(1 ≤ n ≤ 20000 ,1 ≤ m ≤ 20)
接下来n行,每行一个由字母A',
C’, G' ,
T’构成的字符串,表示一条DNA序列。
输入以0 0作为结束。
输出格式
对于每组测试数据,输出n行,每行一个整数。
第1行表示没有被克隆的人的数量
第2行表示被克隆了1次的人的数量
第3行表示被克隆了2次的人的数量
……
第n行表示被克隆了n-1次的人的数量
样例数据
样例输入
9 6
AAAAAA
ACACAC
GTTTTG
ACACAC
GTTTTG
ACACAC
ACACAC
TCCCCC
TCCCCC
0 0
样例输出
1
2
0
1
0
0
0
0
0
说明
Huge input file, ‘scanf’ recommended to avoid TLE.
题目分析
trie树+Hash
源代码
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const int Get_Int() {
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
const int maxn=50005;
struct Tree {
int child[26],bj,cnt;
void clear() {
memset(child,0,sizeof(child));
bj=0;
cnt=0;
}
};
struct Trie {
Tree tree[maxn*3];
int cnt;
void init() {
cnt=0;
memset(tree,0,sizeof(tree));
}
void insert(string s) { //插入字符串s
int x=0;
for(int i=0; i<s.length(); i++) {
int y=s[i]-'A';
if(tree[x].child[y]==0) { //没有此结点,新建结点
tree[x].child[y]=++cnt;
tree[cnt].clear();
x=cnt;
} else x=tree[x].child[y];
}
tree[x].bj=1;
tree[x].cnt++;
}
int Find(string s) { //返回字符串s出现的下标,没有返回-1
int x=0;
for(int i=0; i<s.length(); i++) {
int y=s[i]-'A';
if(tree[x].child[y]==0)return -1; //不在树中
x=tree[x].child[y];
}
if(tree[x].bj)return x; //有标记域才能返回
else return -1;
}
};
Trie trie;
int n,m,Hash[20005];
int main() {
ios::sync_with_stdio(false);
while(cin>>n>>m) {
if(n==0&&m==0)break;
trie.init();
memset(Hash,0,sizeof(Hash));
for(int i=1; i<=n; i++) {
string s;
cin>>s;
trie.insert(s);
}
for(int i=1; i<=trie.cnt; i++)Hash[trie.tree[i].cnt-1]++;
for(int i=0; i<n; i++)printf("%d\n",Hash[i]);
}
return 0;
}