题意:
有n和DNA序列,求出他们中公共前缀长度和有相同公共前缀DNA序列乘积的最大值。
解析:
这题用trie来搞,用trie存储所有的DNA序列,然后每个节点有个val值,还有一个length表示的是存储以该节点结尾的DNA序列的数目,最后求出length*val最大的,就是最终答案。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int sigma_size = 4;
const int maxnode = 50005 * 50;
int val[maxnode], length[maxnode];
int ch[maxnode][sigma_size];
int mp[256];
struct Trie {
int sz;
Trie() { sz = 1; memset(ch[0], 0, sizeof(ch[0]));}
int idx(char c) { return mp[c]; }
void insert(char *s) {
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++) {
int c = idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz], 0, sizeof(ch[sz]));
length[sz] = i+1;
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
val[u]++;
}
}
};
char str[55];
int n;
void setMap() {
mp['A'] = 0; mp['C'] = 1;
mp['G'] = 2; mp['T'] = 3;
}
int main() {
setMap();
int T, cas = 1;
scanf("%d", &T);
while(T--) {
Trie trie;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s", str);
trie.insert(str);
}
int ans = 0;
for(int i = 1; i < trie.sz; i++) {
ans = max(ans, length[i]*val[i]);
}
printf("Case %d: %d\n", cas++, ans);
}
return 0;
}