hdu--2846--字典树<怪我思维不够跳跃>

这题 一眼望去  又TM想用map了。。

想起自己已经学过 字典树了 这题 需要拆分出给的字符串的每个子串 还是蛮麻烦的

然后就是再去匹配查找了

其实 这题 我觉得难点是再有没有想到将字符串拆分成子串进行create

想到了这点 还有一点 就是你怎么判断重一性 <可能记错了> 或者说 假如有个字符串aabb那么你可以拆成a a b b aa ab bb aab abb aabb但是对于a的数量只应该+1次 而不是2次

b也同样。。

我说到这了 可能你想到了....bingo 我们需要一个flag标记变量

--------看上面说的狠轻松   2把LOL打完 我TM地才想到 flag标记变量来做

我这题 还是用的动态版字典树 写起来实在太方便了啊。。

我待会 再贴份 静态版的上来 先去次饭 =-=

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4
 5 const int size = 26;
 6 struct trie
 7 {
 8     struct trie* next[size];
 9     int cnt;
10     int flag;
11 };
12 trie* root;
13 void init( )
14 {
15     root = new trie;
16     for( int i = 0 ; i<size ; i++ )
17     {
18         root->next[i] = NULL;
19         root->cnt = 0;
20         root->flag = -1;
21     }
22 }
23
24 void create( char* str , int len , int flag)
25 {
26     trie* p =root;
27     trie* q;
28     for( int i = 0 ; i<len ; i++ )
29     {
30         int id = str[i] - ‘a‘;
31         if( p->next[id] == NULL )
32         {
33             q = new trie;
34             for( int i = 0 ; i<size ; i++ )
35             {
36                 q->next[i] = NULL;
37                 q->cnt = 0;
38                 q->flag = -1;
39             }
40             p->next[id] = q;
41         }
42         p = p->next[id];
43     }
44     if( p->flag!=flag )
45     {
46         p->flag = flag;
47         p->cnt ++;
48     }
49 }
50
51 int find( char* str )
52 {
53     trie* p = root;
54     int len = strlen(str);
55     for( int i = 0 ; i<len ; i++ )
56     {
57         int id = str[i] - ‘a‘;
58         if( p->next[id] == NULL )
59         {
60             return 0;
61         }
62         p = p->next[id];
63     }
64     return p->cnt;
65 }
66
67 int main()
68 {
69     cin.sync_with_stdio(false);
70     int n , m , len;
71     char str[25];
72     init( );
73     cin >> n;
74     while( n-- )
75     {
76         cin >> str;
77         len = strlen(str);
78         for( int i = 0 ; i<len ; i++ )
79         {
80             for( int j = 1 ; i+j<=len ; j++ )
81             {
82                 create( str+i , j , n);
83             }
84         }
85     }
86     cin >> m;
87     while( m-- )
88     {
89         cin >> str;
90         cout << find(str) << endl;
91     }
92     return 0;
93 }

静态版的 写起来 就是麻烦了点 但是速度也没快多少啊=-=  难道是我写的太差嘛

#include <iostream>
#include <cstring>
using namespace std;

int sum = 0;
const int size = 26;
const int num = 1000010;
struct trie
{
    int next[size];
    int cnt;
    int flag;
};
trie node[num];
void init( int root )
{
    for( int i = 0 ; i<size ; i++ )
    {
        node[root].next[i] = -1;
        node[root].cnt = 0;
        node[root].flag = -1;
    }
}

void create( char* str , int len , int flag)
{
    int root = 0;
    for( int i = 0 ; i<len ; i++ )
    {
        int id = str[i] - ‘a‘;
        if( node[root].next[id] == -1 )
        {
            node[root].next[id] = ++sum;
            init( sum );
            root = sum;
        }
        else
        {
            root = node[root].next[id];
        }
    }
    if( node[root].flag!=flag )
    {
        node[root].flag = flag;
        node[root].cnt ++;
    }
}

int find( char* str )
{
    int root = 0;
    int len = strlen(str);
    for( int i = 0 ; i<len ; i++ )
    {
        int id = str[i] - ‘a‘;
        if( node[root].next[id] == -1 )
        {
            return 0;
        }
        root = node[root].next[id];
    }
    return node[root].cnt;
}

int main()
{
    cin.sync_with_stdio(false);
    int n , m , len;
    char str[25];
    init(0);
    cin >> n;
    while( n-- )
    {
        cin >> str;
        len = strlen(str);
        for( int i = 0 ; i<len ; i++ )
        {
            for( int j = 1 ; i+j<=len ; j++ )
            {
                create( str+i , j , n);
            }
        }
    }
    cin >> m;
    while( m-- )
    {
        cin >> str;
        cout << find(str) << endl;
    }
    return 0;
}

today:

  你能用  一句话总结自己过去的10年吗?

  十年前总是计划着十年后
  十年后时刻回忆着十年前

  -------扯淡

  以我20岁而言

 十年前 才10岁 还在玩捉迷藏了

  十年后 才30岁 不知道在干什么了

  ----------开心就好

hdu--2846--字典树<怪我思维不够跳跃>

时间: 2024-11-08 19:22:32

hdu--2846--字典树<怪我思维不够跳跃>的相关文章

Repository HDU - 2846 字典树

题意:给出很多很多很多很多个 单词 类似搜索引擎一下 输入一个单词 判断有一个字符串包含这个单词 思路:字典树变体,把每个单词的后缀都扔字典树里面,这里要注意dd是一个单词 但是把d 和dd都放字典树 拿d匹配这一个单词会匹配两次 所以要开个数组记录一下上一个使该位置数量加一的字符串 如果该字符串不是同一个 那就可以加加了 TLE:还是数组大小的问题 字典树有毒!因为一个字符串可以拆成很多个后缀所以必须开大,开大了就过了... 1 #include<bits/stdc++.h> 2 using

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 2795 线段树(转变思维方能改变世界)

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9895    Accepted Submission(s): 4413 Problem Description At the entrance to the university, there is a huge rectangular billboard of si

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强.这时候,