light OJ -DNA Prefix (字典树)
2016-07-16 17:05
344 查看
题目链接:
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=121897#problem/G题目大意:
寻找所给字符串的 前缀*出现次数 的最大值题解:
字典树,v[u]为结点出现次数,存字符串后利用搜索不断遍历所有有字母的点,找到最大值。此题因为只有4个字母,所以字典树的宽度应为4,如果为26会超出内存。AC代码:
#include <cstdio> #include <algorithm> #include <cstring> #include <cctype> #include <iostream> using namespace std; const int maxnode = 2500500; const int sigma = 4; int ch[maxnode][sigma],v[maxnode],sz,ans; int u; int maxx; int numb[maxnode]; struct trie { trie() { sz=1; memset(v,0,sizeof v); memset(ch[0],0,sizeof ch[0]); } int idx(char c)//如果不这样存的话会爆内存 { if(c == 'C') return 1; else if(c == 'G') return 2; else if(c == 'T') return 3; return 0; } void insert(char* s) { int l =strlen(s); u=0; for(int i=0;i<l;i++) { int c = idx(s[i]); if(!ch[u][c]) { v[sz] = 0; memset(ch[sz],0,sizeof ch[sz]); ch[u][c] = sz++; //cout << ch[u][c] <<endl; } u = ch[u][c]; v[u] ++; } } void solve(int u, int d)//搜索寻找最大值,d为前缀长度 { ans = max(ans, d * v[u]); for (int i = 0; i < 4; i++) { if (ch[u][i]) solve(ch[u][i], d + 1); } } }T; int n,m; char c[105]; int main() { int TTT; int cnt = 1; cin >> TTT; while(TTT--) { int nnn; cin >> nnn; while(nnn--) { scanf("%s" , c); T.insert(c); } ans = 0; T.solve(0,0); printf("Case %d: %d\n", cnt++, ans); sz=1; memset(v,0,sizeof v); memset(ch[0],0,sizeof ch[0]); } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002