动态字典树_字串标记查找+大数(HDU_4099)

#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;

#define MU 10
#define WLEN 100
#define M 100000

struct node{
    int id;
    node *child[MU];
    node()
    {
        id = -1;
        memset(child,NULL,sizeof(child));
    }
};

char fnMap[3][WLEN] = {"1","1"};

void clear(node *root)
{
    for(int i=0; i<MU; i++)
    { 
        if(root->child[i] != NULL)
            clear(root->child[i]);
    }
    delete root;
}

void insert(node *root, char *str, int addId)
{
    node *p = root;
    int len = strlen(str);
    for(int i=0; i<len && i<40; i++)
    {
        int k = str[i] - '0';
        if(p->child[k] == NULL)
        {
            p->child[k] = new node;
        }
        p = p->child[k];
        if(p->id < 0)
        {
            p->id = addId;
        }
    }
}

int find(node *root, char *str)
{
    node *p = root;
    int len = strlen(str);
    for(int i=0; i<len; i++)
    {
        int k = str[i] - '0';
        if(p->child[k] == NULL)
        {
            return -1;
        }
        p = p->child[k];
    }
    return p->id;
}

void add(char *aStr, char *bStr, char *cStr)//aStr + bStr = cStr
{
    int ai = strlen(aStr)-1,bi = strlen(bStr)-1,ci = 0;
    int all,over = 0;
    
    for(; ai>=0 || bi>=0; ai--,bi--)
    {
        all = (ai>=0 ? aStr[ai] : '0') + (bi>=0 ? bStr[bi] : '0') + over - 2 * '0';
        cStr[ci++] = all % 10 + '0';
        over = all / 10;
    }
    if(over > 0)    cStr[ci++] = over + '0';
    cStr[ci] = '';
    strrev(cStr);
}

void init(node *root)
{
    //fnMap[0] = "1",fnMap[1] = "1";
    insert(root,fnMap[0],0);
    insert(root,fnMap[1],1);
    for(int i=2; i<M; i++)
    {
        int aLen = strlen(fnMap[0]);
        int bLen = strlen(fnMap[1]);
        if(bLen > 60)
        {
            fnMap[0][aLen-1] = fnMap[1][bLen-1] = '';
        }
        add(fnMap[0],fnMap[1],fnMap[2]);
        insert(root,fnMap[2],i);
        memcpy(fnMap[0],fnMap[1],sizeof(fnMap[0]));
        memcpy(fnMap[1],fnMap[2],sizeof(fnMap[1]));
    }
}

int main(int argc, char* argv[])
{
#ifdef __MYLOCAL
    freopen("in.txt","r",stdin);
#endif
    
    int t;
    char findStr[WLEN];
    node *root = new node;
    init(root);
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        scanf("%s",findStr);
        printf("Case #%d: %d
",i,find(root,findStr));
    }
    clear(root);
    return 0;
}
原文地址:https://www.cnblogs.com/lk1993/p/3225987.html