Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 8306 | Accepted: 3130 |
Description
Input
Output
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
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<sstream> #include<algorithm> #include<queue> #include<deque> #include<vector> #include<cmath> #include<map> #include<stack> #include<set> #include<fstream> #include<memory> #include<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 20003 #define L 20 #define INF 1000000009 #define eps 0.00000001 /* 给出多个DNA序列 要求有i份copy的DNA序列数 先插入结点 计算个数 最后搜一下 */ int n, m; int cnt[MAXN]; char s[L]; typedef struct Treenode { int cnt; struct Treenode* Next[4]; }*Tree; Tree Newnode() { Tree T = (Tree)malloc(sizeof(Treenode)); memset(T->Next, NULL, sizeof(T->Next)); T->cnt = -1; return T; } void Insert(char s[], Tree T) { if (!T) T = Newnode(); int p = 0,k; while (s[p]) { if (s[p] == ‘A‘) k = 0; else if (s[p] == ‘C‘) k = 1; else if (s[p] == ‘G‘) k = 2; else k = 3; if (!T->Next[k]) { T->Next[k] = Newnode(); } T = T->Next[k]; p++; } if (T->cnt == -1) T->cnt = 1; else T->cnt++; } void dfs(Tree T) { if (!T) return; if (T->cnt != -1) { cnt[T->cnt]++; return; } for (int i = 0; i < 4; i++) dfs(T->Next[i]); } int main() { while (scanf("%d%d", &n, &m), n + m) { Tree T = Newnode(); memset(cnt, 0, sizeof(cnt)); for (int i = 0; i < n; i++) { scanf("%s", s); Insert(s, T); } dfs(T); for (int i = 0; i < n; i++) { printf("%d\n", cnt[i + 1]); } } return 0; }
原文:http://www.cnblogs.com/joeylee97/p/6851594.html