训练总结 1.26

   这两天做题,加深对之前所学知识点的理解。当时看的时候,觉得字典树难,现在看起来还挺简单的。

 POJ 2503 Babelfish  给出两种语言的对应表,通过给出某种语言的一个单词,得出另一种语言中所对应的该单词。

  之前做过这道题,直接用map就可以了。也可以用字典树,在建树的过程中,在字典树节点中存入另一种语言的字符串,val数组表示的是是否为单词的末字母。

    应该注意的是怎么控制输入,sscanf函数的应用。

#include<iostream>
#include<string>
#include<cstdio>
#include<map>
using namespace std;

int main()
{
    string s;
    char ss[100],s1[100],s2[100];
    int x,y;
    map<string,string>m;
    map<string,string>::iterator p;
    while (gets(ss))
    {
        s=ss;
        if(s=="")break;
        else
        {
            sscanf(s.c_str(),"%s %s",s1,s2);
            m[s2]=s1;
        }
    }
    while(gets(ss))
    {
        s=ss;
        p=m.find(s);//从映照容器中查找键值
        if(p!=m.end())
            cout<<m[s]<<endl;
        else 
            cout<<"eh"<<endl;
    }
    return 0;
}

HDU 1671 Phone List+POJ 1056 IMMEDIATEDECODABILITY  一样的题

集合中是否有一个字符串是其他字符串的前缀。

val[u]代表的是u是否为某一单词的末尾字母。在建树时判断是否有当前串的前缀单词,或者以插入串为前缀的长串。


#include<bits/stdc++.h>
using namespace std;

const int N=110000;
const int M=11;

struct Teir
{
    int ch[N][M];
    int val[N];
    int sz;

    void Clear()
    {
        sz=1;
        //val[0]=0;
        memset(ch,0,sizeof(ch));
    }

    int idx(char ch)
    {
        return ch-'0';
    }

    bool Insert(char *s)
    {
        bool f=1;
        int u=0,n=strlen(s);
        for(int i=0;i<n;i++)
        {
            int id=idx(s[i]);
            if(ch[u][id]==0)
            {
                ch[u][id]=sz;
                val[sz]=0;
                memset(ch[sz],0,sizeof(ch[sz]));
                sz++;
            }
            u=ch[u][id];
            if(val[u]>0)//存在当前插入串的前缀
                f=0;
        }
        val[u]=1;
        if(f)
        {
            for(int i=0;i<11;i++)
            {
                if(ch[u][i]!=0)//存在当前包含插入串的长串
                {
                    f=0;
                    break;
                }
            }
        }
        return f;
    }
}teir;

char word[21];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        teir.Clear();
        bool f=1;
        for(int i=0;i<n;i++)
        {
            scanf("%s",word);
            if(f)
                f=teir.Insert(word);
        }
        if(f)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值