zoukankan      html  css  js  c++  java
  • (字典树)HDU

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247


    题意:输出在所给字典中所有的hat's word。hat's word:是字典中由其他两个单词连接而成的的单词。


    分析:现存下所有单词,然后遍历查询。用exist记录当前节点是否组成单词。当遍历某一个单词word时,如果在遍历结束前,在第i个查到当前前缀已经组成了单词,那么再从头遍历检查word.substr(i+1,word.length())【从第1个开到末尾组成的子串】。因为可能存在多个i,所以用res记录可以组合的方法数,最后判断如果res>0,则输出那个word。

    因为两个单词检查判断不太一样,可以分两个函数写。


    代码:

      1 #include <set>
      2 #include <map>
      3 #include <list>
      4 #include <cmath>
      5 #include <queue>
      6 #include <vector>
      7 #include <bitset>
      8 #include <string>
      9 #include <cctype>
     10 #include <cstdio>
     11 #include <cstring>
     12 #include <cstdlib>
     13 #include <iostream>
     14 #include <algorithm>
     15 
     16 using namespace std;
     17 
     18 typedef long long ll;
     19 typedef unsigned long long ull;
     20 #define inf (0x3f3f3f3f)
     21 #define lnf (0x3f3f3f3f3f3f3f3f)
     22 #define eps (1e-8)
     23 int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}
     24 
     25 //--------------------------
     26 
     27 struct  Trie_node {
     28     int cnt;
     29     int next[26];
     30     bool exist;
     31 }tree[400010];
     32 int nxt;
     33 
     34 int  createTrieNode() {
     35     memset(&tree[nxt], 0, sizeof(Trie_node));
     36     return nxt++;
     37 }
     38 
     39 void Trie_insert(string &word) {
     40     int rt=0;
     41     int len=word.length();
     42     for(int i=0;i<len;i++){
     43         int id = word[i]-'a';
     44         if(!tree[rt].next[id]){
     45             tree[rt].next[id]=createTrieNode();
     46         }
     47         rt=tree[rt].next[id];
     48         tree[rt].cnt++;
     49     }
     50     tree[rt].exist=true;
     51 }
     52 
     53 bool Trie_search2(string word){
     54     int rt=0;
     55     int len=word.length();
     56     for(int i=0;i<len;i++){
     57         int id=word[i]-'a';
     58         if(!tree[rt].next[id])return false;
     59         rt=tree[rt].next[id];
     60     }
     61     return tree[rt].exist;
     62 }
     63 
     64 bool Trie_search1(string &word) {
     65     int rt=0;
     66     int len=word.length();
     67     int res=0;
     68     for(int i=0;i<len;i++){
     69         int id=word[i]-'a';
     70         rt=tree[rt].next[id];
     71         if(tree[rt].exist&&Trie_search2(word.substr(i+1,len-i-1)))res++;
     72     }
     73     return res>0;
     74 }
     75 
     76 void init(){
     77     nxt=1;
     78     memset(&tree[0],0,sizeof(Trie_node));
     79 }
     80 
     81 string word[50010];
     82 
     83 void solve() {
     84     init();
     85     int n=0;
     86     while(cin>>word[n]){
     87         Trie_insert(word[n]);
     88         n++;
     89     }
     90     for(int i=0;i<n;i++){
     91         if(Trie_search1(word[i]))cout<<word[i]<<endl;
     92     }
     93 
     94 }
     95 
     96 
     97 
     98 
     99 int main() {
    100 
    101 #ifndef ONLINE_JUDGE
    102     freopen("in.txt", "r", stdin);
    103     //freopen("out.txt", "w", stdout);
    104 #endif
    105     //iostream::sync_with_stdio(false);
    106     solve();
    107     return 0;
    108 }
  • 相关阅读:
    python抢票开发——设备预约助手实现
    树莓派的基本网络配置
    python 端口扫描程序
    数据通讯与网络 第五版第24章 传输层协议-TCP协议部分要点
    数据通讯与网络 第五版第24章 传输层协议-UDP协议部分要点
    利用python开发的flappy bird 游戏
    EMACS 快捷键笔记
    python程序中用类变量代替global 定义全局变量
    在树莓派下对多个串口转USB设备进行设备名称绑定操作
    python 编写的经纬度坐标转换类
  • 原文地址:https://www.cnblogs.com/tak-fate/p/5873976.html
Copyright © 2011-2022 走看看