zoukankan      html  css  js  c++  java
  • trie树--Shortest Prefixes

    *传送

    *题意:给出一系列相似的单词,问最少到第几位,才能完全区分他们并输出

    即使看到题的时候还没有写过trie树,但是第一反应就是,trie树记录每一位有多少单词经过,到等于1恰好截止

    trie树流程:trie树分为建树和查找,建树一般没什么区别,从0开始为根节点,如果当前节点的子节点没有想要的字符,就多加一支,为了方便我们可以把字符转换成int型s[i]-'a',一般情况下还得记录终止节点。当然本题还需要记录一下每个节点经过的次数

    搜查的时候,如果vis一直>1就添加继续向下找,如果=1,添加后返回

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 char s[25000][50];
     7 int vis[25000],trie[25000][50],cnt=0;
     8 void build(char *c){
     9     int root=0,len=strlen(c);    
    10     for (int i = 0;i < len;i++){
    11         //cout<<1<<endl;
    12         int next=c[i]-'a';
    13         if (!trie[root][next])trie[root][next]=++cnt;
    14         root=trie[root][next];
    15         vis[root]++;
    16     }
    17 }
    18 string query(char *c){
    19     string ans;
    20     int root=0,len=strlen(c);
    21     for(int i = 0;i < len;i++){
    22         if(vis[root]==1)
    23             return ans;
    24         int next=c[i]-'a';
    25         ans+=c[i];
    26         root=trie[root][next];
    27     }
    28     return ans;
    29 }
    30 int main(){
    31     int n=0;
    32     while (scanf ("%s",s[n])!=EOF){
    33         build(s[n]);n++;
    34     }
    35     for (int i = 0;i <n;i++) cout<<s[i]<<" "<<query(s[i])<<endl;
    36     return 0;
    37 }
  • 相关阅读:
    css 笔记
    解决谷歌浏览器中的input背景色默认是黄色
    lunbo
    操作json进行分组再组
    点击返回顶部
    关于有的手机浏览器下载APK时会成TXT
    火狐浏览器jsonshow插件
    微信web开发者工具
    浏览器UA
    click多次注册事件会导致一个事件被触发多次的解决方法
  • 原文地址:https://www.cnblogs.com/very-beginning/p/13542088.html
Copyright © 2011-2022 走看看