zoukankan      html  css  js  c++  java
  • HDU1075 字典树板子题

    题意 :给出两组字符串 一一映射,给出一种组成的文字,要求映射成另外一种
    思路:使用字典树,把映射的另外一个字符存在字典树的单词节点处  例如 abc   123

    则把123存在abc节点中的c处即可

    同时这里使用的是静态的数组,操作和写起来都更方便,就是要提前判断开的空间,过大过小都会有莫名其妙的错误

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn=5e5+5;
     6 const int size=26;
     7 struct Trie{
     8     int ch[maxn][size];
     9     char str[maxn][20];
    10     bool isEnd[maxn];
    11     int size;
    12     void init(){
    13         size=1;
    14         memset(ch,0,sizeof(ch));
    15         memset(isEnd,0,sizeof(isEnd));
    16     }
    17     int index(char s){
    18         return s-'a';
    19     }
    20     void insert(char*s1,char*s2){
    21         int i,rt;
    22         for(i=rt=0;s1[i]!='';i++){
    23             int c=index(s1[i]);
    24             if(ch[rt][c]==0){
    25                 ch[rt][c]=size++;
    26             }
    27             rt=ch[rt][c];
    28         }
    29         strcpy(str[rt],s2);
    30         isEnd[rt]=1;
    31     }
    32     const char*find(char*s){
    33         int i,rt;
    34         for(i=rt=0;s[i]!='';i++){
    35             int c=index(s[i]);
    36             if(!ch[rt][c])return "0";
    37             rt=ch[rt][c];
    38         }
    39         return (isEnd[rt])?str[rt]:"0";
    40 
    41     }
    42 }trie;
    43 char s1[maxn],s2[maxn];
    44 int main(){
    45     trie.init();
    46 while(scanf("%s",s1)==1){
    47     if(!strcmp(s1,"START"))continue;
    48     if(!strcmp(s1,"END"))break;
    49     scanf("%s",s2);
    50     trie.insert(s2,s1);
    51 }
    52 //cout<<111<<endl;
    53 getchar();
    54 while(gets(s1)){
    55     if(!strcmp(s1,"START"))continue;
    56     if(!strcmp(s1,"END"))break;
    57     int i=0;
    58     while(s1[i]!=''){
    59     if(s1[i]>='a'&&s1[i]<='z'){
    60         int j=0;
    61         while(s1[i]!=''&&s1[i]>='a'&&s1[i]<='z'){
    62             s2[j++]=s1[i++];
    63         }
    64         s2[j]='';
    65         const char*temp=trie.find(s2);
    66         if(temp[0]=='0')printf("%s",s2);
    67         else printf("%s",temp);
    68     }
    69     else putchar(s1[i++]);
    70 //    puts("");
    71     }
    72 //    puts("");
    73     cout<<endl;
    74 }
    75 return 0;
    76 }
  • 相关阅读:
    U盘安装Ubuntu 10.4 Server
    MySQL操作使用
    Fedora17安装MySQL及配置
    笔记:重构
    Java 并发之线程安全
    Java 并发之共享对象
    UTF8 与 UTF16 编码
    matplotlib 初使用
    用 ggplot2 在同一个图上画多条颜色不同的线
    完成情况(一)
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10252566.html
Copyright © 2011-2022 走看看