START from fiwo hello difh mars riwosf earth fnnvk like fiiwj END START difh, i‘m fiwo riwosf. i fiiwj fnnvk! END
hello, i‘m from mars. i like earth!HintHuge input, scanf is recommended.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 27 ;
const int maxn = 30005 ;
const int Max = 1000005;
struct trie{
    int point;
    trie *next[MAX];
};
trie *root=new trie;
char s[maxn],ss[MAX];
char anStr[Max][15];
int slen,k=1,ak,aj;
void createTrie(char *s,int pose){
    trie *p=root,*q;
    int len=strlen(s),pos;
    for(int i=0;i<len;i++){
        pos=s[i]-'a';
        if(p->next[pos]==NULL){
            q=new trie;
            q->point=0;
            for(int j=0;j<MAX;j++)
                q->next[j]=NULL;
            p->next[pos]=q;
            p=p->next[pos];
        }
        else{
            p=p->next[pos];
        }
    }
    p->point=pose;   //字符串结尾标志,并且大小为单词所在数组下标。
}
int findTrie(char *s){
    trie *p=root;
    int len=strlen(s),pos;
    for(int i=0;i<len;i++){
        pos=s[i]-'a';
        if(p->next[pos]==NULL)
            return 0;
        p=p->next[pos];
    }
    return p->point;
}
void delTrie(trie *Root){
    for(int i=0;i<MAX;i++){
        if(Root->next[i]!=NULL)
            delTrie(Root->next[i]);
    }
    free(Root);
}
int main(){
    for(int i=0;i<MAX;i++)
        root->next[i]=NULL;
    while(gets(s)){
        if(strcmp(s,"END")==0) break;
        if(strcmp(s,"START")==0) continue;
        slen=strlen(s);
        for(int i=0;i<slen;i++){
            if(s[i]==' '){
                aj=i+1;
                break;
            }
            anStr[k][i]=s[i];
        }
        ak=0;
        for(;aj<slen;aj++) ss[ak++]=s[aj];
        createTrie(ss,k);
        k++;
        memset(ss,'\0',sizeof(ss));
    }
    while(gets(s)){
        if(strcmp(s,"END")==0) break;
        if(strcmp(s,"START")==0) continue;
        slen=strlen(s);
        ak=0,aj=0;
        for(int i=0;i<slen;i++){
            if((s[i]>='a'&&s[i]<='z')||s[i]=='\''){
                ss[ak++]=s[i];
                aj=0;
            }
            else{
                if(!aj){
                    int judge=findTrie(ss);
                    if(judge) printf("%s",anStr[judge]);
                    else printf("%s",ss);
                    memset(ss,'\0',sizeof(ss));
                    ak=0;
                }
                aj++;
                printf("%c",s[i]);
            }
        }printf("\n");
    }
    delTrie(root);
    return 0;
}
HDU_1075_What Are You Talking About(字典树)
原文:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/44663263