POJ 2503 字典树

这题记得以前是我们周赛的题,然后用的是map,也暴过了。

因为这两天要给大一的讲字典树,所以练练几道的代码,以防给大一搞晕了……

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 510010
#define maxn 400010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int ch[maxn][27]; //节点编号
int sz; //字典树的节点个数
int val[maxn]; //节点的值,为1说明新增一个字符串
char str[maxn][11];
void init()  //初始化
{
    sz=1;
    memset(ch,0,sizeof(ch));
    memset(val,0,sizeof(val));
}
void insert(char *s,char *ss)
{
    int u=0,i,c,l=strlen(ss);
    for(i=0; i<l; i++)
    {
        c=ss[i]-'a';
        if(!ch[u][c]) ch[u][c]=sz++;
        u=ch[u][c];
    }
    val[u]=1;
    strcpy(str[u],s);
}
void query(char *s)
{
    int u=0,i,c,l=strlen(s),flag=1;
    for(i=0; i<l; i++)
    {
        c=s[i]-'a';
        if(!ch[u][c]) {flag=0;break;}
        u=ch[u][c];
    }
    if(val[u]&&flag) printf("%s\n",str[u]);
    else puts("eh");
}
int main()
{
    char s[22],s1[12],s2[12];
    init();
    while(gets(s),s[0]!='\0')
    {
        int i,len=strlen(s),j=0,k=0,flag=1;
        for(i=0;i<len;i++)
        {
            if(s[i]!=' '&&flag) s1[j++]=s[i];
            else if(s[i]!=' '&&!flag) s2[k++]=s[i];
            else flag=0;
        }
        s1[j]='\0';s2[k]='\0';
        insert(s1,s2);
    }
    while(gets(s)) query(s);
    return 0;
}

POJ 2503 字典树,布布扣,bubuko.com

时间: 2024-12-21 10:13:58

POJ 2503 字典树的相关文章

POJ 2418 字典树

题目链接:http://poj.org/problem?id=2418 题意:给定一堆树的名字,现在问你每一棵树[无重复]的出现的百分比,并按树名的字典序输出 思路:最简单的就是用map来写,关于字典树的解法,因为字典序的先序遍历是排序的,所以只需建好树后先序遍历一下树就可以满足题目要求的输出方式了. 坑点:树名会出现空格,而且题目也没说明可能出现的字符集合,所以树的孩子结点要有128个. G++无限WA换C++就能AC,这个无解... map: #define _CRT_SECURE_NO_D

POJ 2418 字典树 or map

e...... DESCRIPTION: 给你许多种名字可以重复.要求你统计每种名字的比例.按照字典序输出每种名字及其所占比例.可以用字典树快速存储,输出大量字符串. 也可以用map.但是.map不太熟.输出好烦.为什么key值是字符数组的时候只能用Cout不能是printf.也不能用各种字符数组的函数呢.什么鬼!T_T用完C++还有编译器C++WA.G++AC.>_<. 附代码:map: #include<stdio.h>#include<string.h>#incl

poj 3764 字典树

The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7332   Accepted: 1555 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: ⊕ is the xor operator. We

poj 2503 Trie树

典型的Trie树, 算是复习一下字符串吧, 就是输入有点恶心,代码如下: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 500000+100; struct Trie{ bool isword; int next[26]; char words[15]; Trie(){ memset(next, -1, sizeof(next

POJ 2001 字典树(入门题)

#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> #include<cmath> #include<queue> #include<map> using namespace std; struct Node { int c; int ne

POJ 2513 字典树+并查集+欧拉路径

Description: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点 问题便转化为: 给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次. 这样就是求图中是否存在欧拉路Euler-Path.(我才知道这个就是欧拉路径...T_T) 由图论知识可以知道,无向图存在欧拉路的充要条件为: ①    

POJ 2513(字典树hash+并查集+欧拉通路)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 31015   Accepted: 8180 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

POJ 2503 Babelfish(字典树)

题目链接:http://poj.org/problem?id=2503 题意:翻译单词,若在词典中找不到则输出eh. 思路:裸的字典树. 代码: #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <string> #include <vector> using

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']