这一题数据处理真坑爹。。。快耗了我一天时间。。。字典树伤不起啊。。。
#include<string.h>
#include<string>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<cctype>
using namespace std;
typedef struct NODE
{
char *s;
struct NODE *next[26];
NODE()
{
memset(next,0,sizeof(next));
s=0;
}
~NODE()
{
for(int i=0;i<26;++i)
if(next[i]) delete next[i];
if(s) delete[]s;
}
}*Node,T;
class Tire
{
private : Node root;
public:
Tire()
{
root=new T;
}
~Tire()
{
if(root) delete root;
}
void insert(char* s0,char* s1);
char* find(char* s0);
};
void Tire::insert(char* s0,char *s1)
{
int n=strlen(s0);
Node head=root;
int i=0;
while(s0[i])
{
int k=(int)(s0[i]-97);
if(head->next[k]==NULL) head->next[k]=new T;
head=head->next[k];
i++;
}
head->s=new char(15);
strcpy(head->s,s1);
}
char* Tire::find(char *s0)
{
int n=strlen(s0);
Node head=root;
int i=0;
while(s0[i])
{
int k=(int)(s0[i]-97);
if(head->next[k]) head=head->next[k];
else return NULL;
i++;
}
return head->s;
}
char str[3010];
int main()
{
char word1[15],word2[15];
cin>>word1;
Tire tree;
while(cin>>word1>>word2&&strcmp(word1,"END"))
tree.insert(word2,word1);
getchar();
char tmp[50];
while(gets(str)&&strcmp(str,"END"))
{
int cnt = 0;
for(int i=0;i<strlen(str);++i)
{
if(islower(str[i])) tmp[cnt++] = str[i];
else
{
if(cnt > 0)
{
tmp[cnt++] = '\0';cnt = 0;
char *res=tree.find(tmp);
if(res) printf("%s",res);
else printf("%s",tmp);
}
cout<<str[i];
}
}cout<<endl;
}return 0;
}