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