zoukankan      html  css  js  c++  java
  • 字典树 之 hdu 1247

    /*
    放了一天,晚上突然想出其这道题哪里出了问题。。。悲催的Runtime Error(ACCESS_VIOLATION)
    此题思路:
    1)建字典树
    2)尝试把每个单词拆成两个单词的所有情况,判断这两个单词是否都在字典树中
    若为true,输出该单词;否则不输出该单词
     
    做题中碰到的问题:
    1)一直用string,结果指针用的很悲催。。。(程序中对错误的使用指针做了解释)
    2)学到了strncpy这个很棒的函数
    3)搜索串时,由于把每个单词拆开,故要防止访问空指针(考虑的不周全啊!!!)
     
    */
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 const int MAX = 26;
     7 
     8 struct Trie {
     9     bool Judge;
    10     Trie *next[MAX];
    11     Trie() {
    12         Judge = false;
    13         memset(next, NULL, sizeof(next));
    14     }
    15 };
    16 
    17 Trie *Root = new Trie;
    18 
    19 void CreTrie(char *str)
    20 {
    21     int len = strlen(str);
    22     Trie *p = Root;
    23     for (int i = 0; i < len; ++i) {
    24         int pos = str[i] - 'a';
    25         if (!(p->next[pos])) {
    26             p->next[pos] = new Trie;
    27         }
    28         p = p->next[pos];
    29     }
    30     p->Judge = true;
    31 }
    32 
    33 bool SeTrie(char *str)
    34 {
    35     int len = strlen(str);
    36     Trie *p = Root;
    37     for (int i = 0; i < len; ++i) {
    38         int pos = str[i] - 'a';
    39         if (!(p->next[pos])) {  // 防止搜索串时,访问空指针
    40             return false;
    41         }
    42         p = p->next[pos];
    43     }
    44     return p->Judge;
    45 }
    46 
    47 void DelTrie(Trie *T)
    48 {
    49     for (int i = 0; i < MAX; i++) {
    50         if (T->next[i]) {
    51             DelTrie(T->next[i]);
    52         }
    53     }
    54     delete[] T;
    55 }
    56 
    57 int main()
    58 {
    59     //freopen("input.txt", "r", stdin);
    60     //freopen("output.txt", "w", stdout);
    61     char str[50];
    62     char** arr = new char*[50000];
    63     int n = 0;
    64     while (~scanf("%s", str)) {
    65         arr[n] = new char[50];
    66         strcpy(arr[n], str);
    67         /*
    68         此处绝不可以用 arr[n] = str 赋值:
    69         str指向 存储的是50个 char 值的内存块的第一个元素,
    70         即存储第一个元素的地址,地制值始终未变,
    71         赋给 arr[i] 的值也始终未变,
    72         故而arr[i] 都指向了最后输入的字符串的第一个元素,
    73         结果输出值也就是最后一个字符串。
    74         */
    75         n++;
    76         CreTrie(str);
    77     }
    78 
    79     for (int i = 0; i < n; ++i) {
    80         int len = strlen(arr[i]);
    81         for (int j = 1; j < len - 1; ++j) {
    82             char temp1[50] = { '' }, temp2[50] = { '' };
    83             strncpy(temp1, arr[i], j);
    84             strncpy(temp2, arr[i] + j, (len - j));
    85             //cout << temp1 << "        " << temp2 << endl;
    86             if (SeTrie(temp1) && SeTrie(temp2)) {
    87                 printf("%s
    ", arr[i]);
    88                 break;
    89             }
    90         }
    91     }
    92     DelTrie(Root);
    93     for (int i = 0; i < n; i++) {
    94         delete[] arr[i];
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    HTTP request smuggling
    Do you really know CSS linear-gradients?
    Populating the page: how browsers work
    船舶智能管理系统API文档
    DocGuarder
    BUC LNB 器件
    BUC 与 LNB 的区别
    EIRP G/T 的意义
    语音的频率、频率分辨率、采样频率、采样点数、量化、增益
    机械波、电磁波的异同
  • 原文地址:https://www.cnblogs.com/shijianming/p/4140841.html
Copyright © 2011-2022 走看看