http://acm.hdu.edu.cn/showproblem.php?pid=1075
查字典的感覺,字典樹或者map容器都可以,附2個版本
/*
hdu 1075
方法一:map容器,自帶查找O(logn)
方法二:字典樹 串的快速檢索
注意字符串的讀入!
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define INF 0x7fffffff
#define inf -INF
#define MM 12900
#define N 50
using namespace std;
typedef long long ll;
const int _max = 5e4 + 10;
map<string,string>mp;
string s,a,b;
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
cin>>s;
while(cin>>a&&a!="END"){
cin>>b;
mp[b] = a;
}
cin>>s;//cout<<s<<endl;
getchar();
a="";
while(getline(cin,s)&&s!="END"){
for(int i = 0; i < s.length();++ i){
if(islower(s[i])){
a+=s[i];
}
else {
if(mp.find(a)!=mp.end()) cout<<mp[a];
else cout<<a;
a="";
printf("%c",s[i]);
}
}
cout<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define INF 0x7fffffff
#define inf -INF
#define MM 12900
#define N 50
using namespace std;
typedef long long ll;
const int _max = 5e4 + 10;
char ans[20];
struct Trie{
Trie *next[26];
int cnt;//從根節點到該節點組成的串的個數
char str[20];
}*root;
void insert(char *s,char *a){
Trie *p = root,*pnew;
for(int i = 0; i < strlen(s);++ i){
int x = s[i]-'a';
if(p->next[x]==NULL){
pnew = new Trie;
pnew->cnt = 0;
// pnew->str = NULL;
for(int j = 0; j < 26; ++ j)
pnew->next[j] = NULL;
p->next[x] = pnew;
}
p=p->next[x];
}
p->cnt = 1;
strcpy(p->str,a);
}
int search(char *s){
Trie *p = root;
for(int i = 0; i < strlen(s);++ i){
int x = s[i]-'a';
if(p->next[x]==NULL) return 0;
p=p->next[x];
}
if(p->cnt==1){
strcpy(ans,p->str);
return 1;
}
return 0;
}
void init(){
root = new Trie;
root->cnt = 0;
for (int i = 0;i < 26;i ++)
root->next[i] = NULL;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
init();
string s;cin>>s;char a[20],b[20];
while(scanf("%s",a)==1&&strcmp(a,"END")){
scanf("%s",b);
insert(b,a);
}
cin>>s;getchar();
memset(a,0,sizeof(a));int k = 0;
while(getline(cin,s)&&s!="END"){
for(int i = 0; i < s.length(); ++ i){
if(islower(s[i])){
a[k++] = s[i];
}
else{
a[k] = '\0';
if(search(a)) printf("%s",ans);
else printf("%s",a);
k = 0;
printf("%c",s[i]);
}
}
printf("\n");
}
return 0;
}