2945

1 /*
2
3 */
4
5 // include file
6 #include <cstdio>
7 #include <cstdlib>
8 #include <cstring>
9 #include <cmath>
10 #include <cctype>
11 #include <ctime>
12
13 #include <iostream>
14 #include <sstream>
15 #include <fstream>
16 #include <iomanip>
17 #include <bitset>
18
19 #include <algorithm>
20 #include <string>
21 #include <vector>
22 #include <queue>
23 #include <set>
24 #include <list>
25 #include <functional>
26
27 using namespace std;
28
29 // typedef
30 typedef long long LL;
31 typedef unsigned long long ULL;
32
33 //
34 #define read freopen("in.txt","r",stdin)
35 #define write freopen("out.txt","w",stdout)
36 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
37 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
38 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
39 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
40 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
41 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
42 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
43
44 #define FF(i,a) for(int i=0;i<(a);i++)
45 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
46
47 #define Z(a) (a<<1)
48 #define Y(a) (a>>1)
49
50 const double eps = 1e-6;
51 const double INFf = 1e10;
52 const int INFi = 1000000000;
53 const double Pi = acos(-1.0);
54
55 template<class T> inline T sqr(T a){return a*a;}
56 template<class T> inline T TMAX(T x,T y)
57 {
58 if(x>y) return x;
59 return y;
60 }
61 template<class T> inline T TMIN(T x,T y)
62 {
63 if(x<y) return x;
64 return y;
65 }
66 template<class T> inline void SWAP(T &x,T &y)
67 {
68 T t = x;
69 x = y;
70 y = t;
71 }
72 template<class T> inline T MMAX(T x,T y,T z)
73 {
74 return TMAX(TMAX(x,y),z);
75 }
76
77
78 // code begin
79 struct trie_node
80 {
81 trie_node* next[4];
82 int cnt;
83 };
84
85 trie_node mem[400010];
86 int dx;
87 trie_node *root;
88
89 int stk[20010],top;
90 int N,M;
91 char in[22];
92 int ans[20010];
93
94 trie_node* CreateNode()
95 {
96 trie_node* p = &mem[dx++];
97 FORi(0,4,1)
98 p->next[i] = NULL;
99 p->cnt = 0;
100 return p;
101 }
102 int getId(char c)
103 {
104 if(c=='A')
105 return 0;
106 if(c=='G')
107 return 1;
108 if(c=='C')
109 return 2;
110 return 3;
111 }
112 void InsertNode(char *tar)
113 {
114 int id;
115 trie_node* p =root;
116 while(*tar)
117 {
118 id = getId(*tar);
119 if(p->next[id]==NULL)
120 {
121 p->next[id] = CreateNode();
122 }
123 p = p->next[id];
124 tar++;
125 }
126 if(p->cnt==0)
127 {
128 stk[top++] = dx-1;
129 }
130 p->cnt++;
131 }
132 int main()
133 {
134 read;
135 write;
136 while(scanf("%d %d",&N,&M)!=-1)
137 {
138 if(N+M==0) break;
139 dx = 0;
140 root = CreateNode();
141 top = 0;
142 FORi(0,N,1)
143 {
144 scanf("%s",in);
145 InsertNode(in);
146 }
147 memset(ans,0,sizeof(ans));
148 FORi(0,top,1)
149 {
150 ans[mem[stk[i]].cnt]++;
151 }
152 FORi(1,N+1,1)
153 {
154 printf("%d\n",ans[i]);
155 }
156 }
157 return 0;
158 }

posted @ 2011-04-07 21:55  AC2012  阅读(223)  评论(0编辑  收藏  举报