hdu 1075 What Are You Talking About(Trie树)

水平太弱了,这道题里面学到很多

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075

//巩固了字符串中'\0'的使用,strlen只求\0前面的串的长度,cout只输出\0前面的串,所以利用\0本质上可以实现字符串的清空操作 

#include<iostream>
#include<cstring>
using namespace std;

struct node{//用trie来存储火星文
    bool val; 
    node* ch[26];
    char word[11];
    node(){
        for(int i=0;i<26;i++)
            ch[i]=NULL;    
        val=0;
    }
};
node *root=new node,*p;

char str[3002];
char str1[11],str2[11],buf[11];//我们从字符串中找出单词,存在buf中,但要注意,要想输出单词,必须在数组结尾加'\0'!!!!!!!! 

int idx( char x ){
    return x-'a';
}

void insert(char* str1,char* str2){//str1为英语,str2为火星语 
    int u;
    p=root;
    for(int i=0;i<strlen(str2);i++)
    {
        u=idx(str2[i]);
        if(p->ch[u]==NULL)
            p->ch[u]=new node;
        p=p->ch[u];
    }
    p->val=1;//表明为单词节点 
    strcpy(p->word,str1);
}

char* query(char* str){//注意str可能只是前缀,所以必须要是单词节点才可以返回 
    int u;
    p=root;
    for(int i=0;i<strlen(str);i++)
    {
        u=idx(str[i]);
        if(p->ch[u]==NULL)
            return str;
        p=p->ch[u];
    }
    if(p->val)
        return p->word;
    else 
        return str;
}

int main(){
    cin>>str1;
    while(cin>>str1){
        if(str1[0]=='E')//strcmp(str,"END")==0
            break;
        cin>>str2;
        insert(str1,str2);
    }
    cin>>str1;
    getchar();//如果不加getchar的话,START下面会多一行空格,不知道怎么回事 
    while(gets(str))
    {
        if(str[0]=='E')
            break;
        for(int i=0,k=0;i<strlen(str);i++)//strlen不会跳过空白字符!!!!!! 
        {
            if(str[i]<'a'||str[i]>'z'){
                buf[k]='\0';
                cout<<query(buf); 
                cout<<str[i];
                k=0;
            }
            else
                buf[k++]=str[i];
        }
        cout<<endl;
    }
    return 0;
}

 

posted @ 2014-02-24 23:41  neverchanje  阅读(173)  评论(0编辑  收藏  举报