用链式字典树解决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 }

 

posted @ 2019-07-10 09:26  KhazixW2  阅读(189)  评论(0编辑  收藏  举报