现在的位置: 首页 > 综合 > 正文

poj 2945 Find the Clones 用trie树实现

2012年02月06日 ⁄ 综合 ⁄ 共 840字 ⁄ 字号 评论关闭
/*

原来动态构树是这么费时间的。。。20000个单词最长为20个的题,跑到了1688MS,

题目:
题目大概是说找出相同的字符串并且统计个数。

分析:
因为昨天刚学完trie树,现在练了几道,有点感觉了,其实本题应该是可以用快排直接安字典序进行排序,然后按前后关系来进行判断有多少个的,下面继续讲讲trie树动态构树法吧:看程序解析

*/
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define X 20005
int d[X],cnt,print[X];
structtrie
{
    int id;
    trie *p[4];
    trie()
    {
        id = -1;
        memset(p,NULL,sizeof(p));
    }
}root;
int insert(trie *r,char *s)
{
    int c;
    for(int i=0;s[i];i++)
    {
        if(s[i]=='A')
            c = 0;
        else if(s[i]=='G')
            c = 1;
        else if(s[i]=='T')
            c = 2;
        else
            c = 3;
        if(r->p[c]==NULL)
            r->p[c] = new trie();
        r = r->p[c];
    }
    if(r->id==-1)
        r->id = cnt++;
    return r->id;
}
int main()
{
    int m,n,q;
    char ch[25];
    while(scanf("%d%d",&m,&n),m||n)
    {
        memset(d,0,sizeof(d));
        cnt = 0;
        trie *r = &root;
        for(int i=0;i<m;i++)
        {
            scanf("%s",ch);
            //cout<<"测试"<<endl;
            q = insert(r,ch);
            d[q]++;
        }
        memset(print,0,sizeof(print));
        for(int i=0;i<cnt;i++)
            print[d[i]]++;
        for(int i=1;i<=m;i++)
            printf("%d\n",print[i]);
    }
    return 0;
}

抱歉!评论已关闭.