zoukankan      html  css  js  c++  java
  • 动态字典树_字串标记查找+大数(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;
    }
  • 相关阅读:
    SQLSERVER查询数据库文件大小
    SQLSERVER 检查内容
    20万DBA都在关注的12个问题 [转载]
    oswbb工具分析主机性能
    Suspending MMON slave action kewrmapsa_ for 82800 seconds
    一次direct path read 故障处理
    Auto Optimizer Stats Collection in 12c
    ORACLE 动态注册和静态注册的区别(转)
    记一次cursor pin s wait on X的处理
    树莓派3b的raspberrypi系统安装pip
  • 原文地址:https://www.cnblogs.com/lk1993/p/3225987.html
Copyright © 2011-2022 走看看