码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-08 20:48:16      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   art   

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

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

然后就是再去匹配查找了

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

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

b也同样。。

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

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

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

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

bubuko.com,布布扣
 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 }
View Code

 

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

bubuko.com,布布扣
#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;
}
View Code

 

 

 

 

today:

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

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

  -------扯淡

  以我20岁而言

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

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

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

 

hdu--2846--字典树<怪我思维不够跳跃>,布布扣,bubuko.com

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

标签:style   blog   http   color   os   io   for   art   

原文地址:http://www.cnblogs.com/radical/p/3899867.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!