hdu-2072(字典树)

字典树模板题

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int tot=1;
int root;
int trie[100500][30];
int flagg[100500];
int visit[100500];
char s[100500];
char t[10050];
int cnt;
void init()
{
    memset(flagg,0,sizeof(flagg));
    memset(trie,0,sizeof(trie));
    memset(visit,0,sizeof(visit));
    tot=1;cnt=0;
}
void build_trie(char *x)
{
    int len=cnt;
    root=0;
    for(int i=0;i<len;i++)
    {
        int id=x[i]-‘a‘+1;
        if(!trie[root][id])
            trie[root][id]=tot++;
        root=trie[root][id];
    }
    flagg[root]=1;
}
bool query(char *x)
{
    int len=cnt;
    root=0;
    for(int i=0;i<len;i++)
    {
        int id=x[i]-‘a‘+1;
        if(!trie[root][id])
        {
            return false;
        }
        root=trie[root][id];
    }
    if(flagg[root]&&visit[root]==0)
    {
        visit[root]=1;
        return true;
    }
    return false;
}
int main()
{
    while(gets(s))
    {
        if(s[0]==‘#‘)
            break;
        init();
        int slen=strlen(s);
        if(s[slen-1]!=‘ ‘)
            s[slen]=‘ ‘;
        for(int i=0;i<=slen;i++)
        {
            if(s[i]==‘ ‘&&cnt!=0)
            {
                build_trie(t);cnt=0;
            }
            else if(s[i]!=‘ ‘)
            {
                t[cnt++]=s[i];
            }
        }
        int ans=0;
        for(int i=0;i<=slen;i++)
        {
            if(s[i]==‘ ‘&&cnt!=0)
            {
                int flag=query(t);cnt=0;
                if(flag)
                ans++;
            }
            else if(s[i]!=‘ ‘)
            {
                t[cnt++]=s[i];
            }
        }
        printf("%d\n",ans);
    }
}

  

原文地址:https://www.cnblogs.com/huangdao/p/9502150.html

时间: 2024-11-07 09:56:39

hdu-2072(字典树)的相关文章

HDU 1800 字典树

Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10065    Accepted Submission(s): 3270 Problem Description In the year 8888, the Earth is ruled by the PPF Empire . As the popul

hdu 1075 字典树

// hdu 1075 字典树 // // 题目大意: // // 给你一个字典,即有两个字符串,一个是英文,一个是火星文,然后 // 输入一段火星文,要你翻译成英文. // // 解题思路: // // 字典树,查字典嘛,有就输出查到的,没有原样输出.将火星文插入到 // 字典树中,然后在字典输中查找.找到了,输出对应的英文,否则,原样输 // 出. // // 感悟: // // 题目确实很简单,但是,没告诉数据范围啊,导致我一直RE,原来单词 // 可能对应很长的英文啊,找人家ac的开数组

HDU 1251 字典树入门

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 17177    Accepted Submission(s): 7410 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前

HDU 5384 字典树、AC自动机

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 1 #include<stdio.h> 2 #include<string.h> 3 #include<string> 4 #include<iostream> 5 using namespace std; 6 struct node{ 7 int cnt; 8 node *next[26]; 9 node(){ 10 c

HDU 5687 字典树插入查找删除

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 1 #include<stdio.h> 2 #include<string.h> 3 struct node{ 4 int next[27]; 5 int cnt; 6 void init(){ 7 cnt = 0;//计数 8 memset(next,-1,sizeof(next)); 9 } 10 };

hdu 5269 字典树

题目链接:hdu 5269 ZYB loves Xor I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 184    Accepted Submission(s): 101 Problem Description Memphis loves xor very musch.Now he gets an array A.The lengt

hdu 2112(字典树+最短路)

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23388    Accepted Submission(s): 5614 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,

Flying to the Mars HDU - 1800(字典树)

Flying to the Mars HDU - 1800 题目链接:https://vjudge.net/problem/HDU-1800 题目:在8888年,地球由PPF帝国统治.随着人口的增长,PPF需要为新生儿寻找更多的土地.最后,PPF决定攻击统治火星的Kscinow.问题来了!士兵怎么能到达火星? PPF召集他的士兵并询问他们的建议. “匆匆......”一名士兵回答. “闭嘴 !我是否必须提醒你,从这里到火星没有任何道路!“PPF回复道. “飞!”另一个答案. PPF笑道:“聪明的

Chip Factory HDU - 5536 字典树(删除节点|增加节点)

题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 (“^”代表异或操作,即“相同为0,不同为1”) 题解: 这一道题和Xor Sum HDU - 4825很相似 因为异或运算的特性,我们最后要求最大值,那我们就对这n个数的二进制形式建一颗字典树.然后就暴力枚举是哪两个数相加,然后在字典树中把这两个数删掉.然后在处理完的字典树中查找那个能使结果尽可能大的第三个数(至于怎么

hdu 2896 字典树解法

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 struct Tree 8 { 9 Tree *next[94]; 10 bool isVirus; 11 int num; 12 }; 13 Tree *root; 14 int al