POJ2945字母树trie的使用

独立地写完了字母树trie处理重复字串的问题,感觉还是挺好的,发篇博客纪念一下。

#include “stdio.h” #include “stdlib.h” #include “string.h” int n,m; typedef struct trie { int num; int deep; struct trie *next[4]; }trie; trie r[20005*20]; int result[20005]; int N(char ch) { switch(ch) { case ‘A’:return 0; case ‘C’:return 1; case ‘G’:return 2; case ‘T’:return 3; default:printf(“char error!/n”); return 0; } } int main() { int i,j,cnt=0; char str[21]; trie *p; p=&(r[cnt++]); freopen(“in.txt”,”r”,stdin); freopen(“out.txt”,”w”,stdout); scanf(“%d%d”,&n,&m); while(! (n==0&&m==0) ) { cnt=0; //一定要注意把初始化写在这里,而不是在while后面。 memset(r,0,sizeof(r)); memset(result,0,sizeof(result)); for (i=0;i<n;i++) { scanf(“%s”,str); p=r; p->num++; for (j=0;j<m;j++) { if(p->next[N(str[j])] == NULL) { p->next[N(str[j])]=&(r[cnt++]); p->next[N(str[j])]->deep = j; } p->next[N(str[j])]->num++; p=p->next[N(str[j])]; } } //printf(“/ncnt=%d/n”,cnt); for (i=0;i<cnt;i++) { //printf(“%d/n”,r[i].num); if (r[i].deep == m-1) { //printf(“deep=6/n”); result[r[i].num-1]++; } } //printf(“/n/n”); for (i=0;i<n;i++) printf(“%d/n”,result[i]); scanf(“%d%d”,&n,&m); } //system(“pause”); return 0; }

    原文作者:Trie树
    原文地址: https://blog.csdn.net/qiuzhenguang/article/details/5379310
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞