• poj 2503 Babelfish 用trie树做


    题目:
    给出英文和密码文的互译,现在给出密码文求给出英文解析
    分析:
    还是可以用字典树来构造的(当然还可以用快排+二分法,哈希函数做),先给出trie树的构造吧


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define X 12
    #define MAXN 100005
    char ch[2*X],s1[MAXN][X],s2[X];
    int cnt;
    struct trie //定义字典树的结构体
    {
    bool haveend;//记录是否有单词在这结束的
    int id; //记录当前的密文顺序
    trie *p[26];//储存26个英文字母
    trie()
    {
    haveend = false;
    id = -1;
    memset(p,NULL,sizeof(p));
    }
    }root;
    void insert(trie *r,char *s)//构造树的函数,把密文插入到树中
    {
    int c;
    for(int i=0;s[i];i++)
    {
    c = s[i]-'a';
    if(r->p[c]==NULL)
    r->p[c] = new trie();//当前为空时,建造新的节点
    r = r->p[c]; //建造下一个节点
    }
    r->id = cnt++; //标记顺序
    r->haveend = true; //标记已有单词在此结束
    }
    int search(trie *r,char *s)
    { //查找函数
    int c;
    int len = strlen(s);
    for(int i=0;i<len;i++)//从根部开始往下走,直到该密文结束为止
    {
    c = s[i]-'a';
    if(r->p[c]==NULL)
    return -1;
    else
    r = r->p[c];
    }
    if(r->haveend)
    return r->id;
    return -1; //不能返回0,因为0代表了第一个输入的单词
    }
    void seg() //把输入的一行即分开成两个字符串
    {
    bool flag = false; //第一个字符串是否结束的标记
    int c1 = 0,c2 = 0;
    int len = strlen(ch);
    for(int i=0;i<len;i++)
    {
    if(ch[i]==' ')
    flag = true;
    if(!flag)
    s1[cnt][c1++] = ch[i];
    else if(flag&&ch[i]!=' ')
    s2[c2++] = ch[i];
    }
    s1[cnt][c1] = '\0';//一定得有结束符号
    s2[c2] = '\0';
    }
    int main()
    {
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    trie *r = &root;
    cnt = 0;
    while(1)
    {
    gets(ch);
    if(strcmp(ch,"")==0)//输入到空行停止输入
    break;
    seg();
    insert(r,s2);
    }
    char str[X];
    while(scanf("%s",str)!=EOF)//输入要匹配的密文
    {
    int qq = search(r,str);
    if(qq==-1) //没找到的话
    printf("eh\n");
    else
    printf("%s\n",s1[qq]);
    }
    return 0;
    }

  • 相关阅读:
    .NET 分布式架构开发实战之一
    frame中隐藏横向滚动条
    实时检测网络状态及是否可以连接Internet
    jquery表格插件推荐
    FireFox窗体frameset,iframe间的js调用方法
    用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通
    一个阴历阳历互相转化的类
    CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能
    Windows下命令行下启动ORACLE服务
    使用C#进行点对点通讯和文件传输(通讯基类部分)
  • 原文地址:https://www.cnblogs.com/yejinru/p/2374678.html
Copyright © 2020-2023  润新知