【字典樹】hdu 1075 What Are You Talking About

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;
}



發佈了201 篇原創文章 · 獲贊 45 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章