hdu1075What Are You Talking About(字典树,map)


使用二分肯定超时了。


map做法:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <map>

using namespace std;

const int N = 3005;
char s[N];
map<string,string> f;

int main()

{
    string x;
    cin >> x;
    while(cin >> x && x != "END")
    {
        string y;
        cin >> y;
        f[y] = x;
    }
    cin >> x;
    getchar();
    while(gets(s))
    {
        if(s[0] == 'E')
            break;
        int len = strlen(s);
        string t = "";
        for(int i = 0;i < len;++i)
        {
            if(s[i] >= 'a' && s[i] <= 'z')
                t += s[i];
            else
            {
                string temp = f[t];
                if(temp != "")
                    cout << temp;
                else
                    cout << t;
                printf("%c",s[i]);
                t = "";
            }
        }
        if(t != "")
        {
            if(f[t] != "")
                cout << f[t];
            else
                cout << t;
        }

        printf("\n");
    }
    return 0;
}


字典树做法:借鉴网上某大神代码。(指针版本)

#include <cstdio>
#include <cstring>

const int MaxLen = 3010;
const int MaxSize = 26;
struct Node{           //字典树结点
    char* val;         //结点值
    Node* next[MaxSize];  //结点的孩子结点
};

struct Trie{             //字典树定义
    Node* root;
    int idx(char c)      //返回字符编号
    {
        return c - 'a';
    }
    Trie(){                //构造函数申请字典树根节点
        root = newNode();
    }
    void init()               //初始化字典树
    {
        del(root);
        root = newNode();
    }

    Node* newNode()       //初始化字典树结点
    {
         Node* u = new Node();
         u -> val = NULL;
         for(int i = 0; i < MaxSize;++i)
            u -> next[i] = NULL;
         return u;
    }
    void insert_node(char* s,char* v)   //插入结点
    {
        Node* u = root;
        int len = strlen(s);
        for(int i = 0;i < len;++i)
        {
            int c = idx(s[i]);
            if(u -> next[c] == NULL)     // 如果没有这个结点
                u -> next[c] = newNode();   //申请
            u = u -> next[c];            //往下走
        }
        u -> val = new char[11];     //申请一下值结点内存,不用值就不用申请
        strcpy(u -> val,v);
    }

    void search_node(char* s)        //寻找结点
    {
        Node* u = root;
        int n = strlen(s);
        for(int i = 0;i < n;++i)
        {
            int c = idx(s[i]);
            if(u -> next[c] == NULL)  //如果当中的某个结点是空的,查找失败了
            {
                printf("%s",s);
                return ;
            }
            u = u -> next[c];
        }
        if(u -> val != NULL)        // 如果这个结点有值。
            printf("%s",u -> val);
        else
            printf("%s",s);
    }
    void del(Node* rt)
    {
        if(rt == NULL)
            return ;
        else
        {
            for(int i = 0;i < MaxSize;++i)
                if(rt -> next[i])
                    del(rt -> next[i]);
        }
        delete rt -> val;
        delete rt;
    }
}trie;

char english[11],mars[11];
char m[MaxLen],t[MaxLen];

int main()

{
     scanf("%s",english);
     while(scanf("%s",english) && strcmp(english,"END"))
     {
         scanf("%s",mars);
         trie.insert_node(mars,english);
     }
     scanf("%s",english);
     getchar();
     int g = 0;
     while(gets(m) && strcmp(m,"END"))
     {
         int len = strlen(m);
         for(int i = 0;i < len;++i)
         {
             if(m[i] >= 'a' && m[i] <= 'z')
                 t[g++] = m[i];
             else
             {
                 t[g] = '\0';
                 trie.search_node(t);
                 printf("%c",m[i]);
                 g = 0;
             }
         }
         printf("\n");
     }
}


大数组版本


#include <cstdio>
#include <cstring>

char start[30];
char english[30];
char mars[30];
int  ch[1000005][30];
char val[1000005][30];
int vis[1000005];
int sz;
char m[3005];

int idx(char c)
{
    return c - 'a';
}
void insert_node(char s[] , char v[])

{
    int u = 0;
    int n = strlen(s);
    for(int i = 0; i < n;++i)
    {
        int c = idx(s[i]);
        if(!ch[u][c])
        {
            //memset(ch[sz],0,sizeof(sz));
            ch[u][c] = sz++;
        }
        u = ch[u][c];
    }
    vis[u] = 1;
    strcpy(val[u],v);
}

int search_node(char s[])

{
    int u = 0;
    int n = strlen(s);
    for(int i = 0 ; i < n;++i)
    {
        int c = idx(s[i]);
        if(!ch[u][c])
            return -1;
        u = ch[u][c];
    }
    if(!vis[u]) return -1;
    return u;
}
int main()

{
    sz = 1;
    memset(ch,0,sizeof(ch));
    memset(val,0,sizeof(val));
    memset(vis,0,sizeof(vis));
    scanf("%s",start);
    while(scanf("%s",english) && english[0] != 'E')
    {
        scanf("%s",mars);
        insert_node(mars,english);
    }
    /*for(int i = 0;i < sz;++i)
        if(vis[i])
           printf("结点%d 的值为%s\n",i,val[i]);*/
    scanf("%s",start);
    getchar();
    int g = 0;
    while(gets(m) && m[0] != 'E')
    {
        int len = strlen(m);
        for(int i = 0;i < len;++i)
        {
             if(m[i] >= 'a' && m[i] <= 'z')
                  mars[g++] = m[i];
             else
             {
                 mars[g] = '\0';
                 int f = search_node(mars);
                 if(f != -1)
                      printf("%s",val[f]);
                 else printf("%s",mars);
                 printf("%c",m[i]);
                 g = 0;
             }
        }
        if(g)
        {
            mars[g] = '\0';
            int f = search_node(mars);
            if(f != -1)
                printf("%s",val[f]);
            else printf("%s",mars);
            g = 0;
        }
        printf("\n");
    }
    return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值