用链式字典树解决POJ2945
首先,我们的思路是用链式的字典树结构,解决poj2945这道题
题意是,统计所有的字符串出现的次数,并依次输出各个次数的数量
例如:
input
9 6
AAAAAA
ACACAC
GTTTTG
ACACAC
GTTTTG
ACACAC
ACACAC
TCCCCC
TCCCCC
out
1
2
0
1
0
0
0
0
0
遇到的一些小麻烦 : 之前提交poj爆内存了,就试了一下这个代码,结果还是爆内存,后来发现,我这里不能设置位 Node *next[26],不然铁定爆内存,于是我认真审题,发现这里设置为4就好啦因为只有4个字符需要入树,至于怎么判断下标,我们用一个fun()函数来解决就好了。
具体的思路就是 : 先用find()判断,是否在树里有该个DNA,如果有让,count[i]--,i++,;count[i]++, 如果没有,用T_insert插入,并给count[1]置为1;
最后输出for(i::n)printf("%d\n",count[i]);就可以了。
1 #include <iostream> 2 #include <cstdio> 3 #pragma comment(linker, "/STACK:1024000000,1024000000") 4 #include <cstring> 5 using namespace std; 6 7 struct Node 8 { 9 Node *next[4]; 10 char val; 11 int count; 12 Node(char val) 13 { 14 this->val =val; 15 count=0; 16 memset(next,NULL,sizeof(next)); 17 } 18 }; 19 20 Node *root =new Node('\0'); 21 int *count; 22 //int *count; 23 int fun(char s) 24 { 25 switch(s) 26 { 27 case 'A':return 0;break; 28 case 'C':return 1;break; 29 case 'G':return 2;break; 30 case 'T':return 3;break; 31 } 32 } 33 bool T_Find(char *s) 34 { 35 int len=strlen(s); 36 Node *p=root; 37 for(int i=0;i<len;i++) 38 { 39 40 int pos=fun(s[i]); 41 if(p->next[pos]==NULL) 42 return false; 43 p=p->next[pos]; 44 } 45 count[p->count]--; //如果 程序运行到最后,出现过两次了,那么 p->count 出现过一次的 count[p->count] -- ,也就是给出现一次的次数减一 46 p->count++; //然后给 p->count 置为出现过2 次 47 count[p->count]++; 48 return true; 49 } 50 51 void T_insert(char *s) 52 { 53 int len=strlen(s); 54 Node *p=root; 55 for(int i=0;i<len;i++) 56 { 57 int pos=fun(s[i]); 58 if(p->next[pos]==NULL) 59 { 60 p->next[pos]= new Node(s[i]); 61 } 62 p=p->next[pos]; 63 } 64 p->count=1; 65 count[p->count]++; 66 } 67 68 /* 69 9 6 70 AAAAAA 71 ACACAC 72 GTTTTG 73 ACACAC 74 GTTTTG 75 ACACAC 76 ACACAC 77 TCCCCC 78 TCCCCC 79 0 0 80 */ 81 82 int main() 83 { 84 85 int n,m; 86 while(scanf("%d%d",&n,&m)==2&&n&&m) 87 { 88 count =new int [n+1]; 89 fill(count,count+n+1,0); 90 for(int i=0;i<n;i++) 91 { 92 char *s; 93 s= new char[m+1]; 94 scanf("%s",s); 95 if(T_Find(s)==false) 96 { 97 T_insert(s); 98 } 99 } 100 int i=0; 101 for( i=1;i<=n;i++) 102 { 103 printf("%d\n",count[i]); 104 } 105 106 } 107 return 0; 108 }