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 }
  • 相关阅读:
    Alpha 答辩总结
    Alpha 冲刺报告(10/10)
    Alpha 冲刺报告(9/10)
    Alpha 冲刺报告(8/10)
    Alpha 冲刺报告(7/10)
    Alpha 冲刺报告(6/10)
    团队作业-随堂小测(同学录)
    第一次寒假作业
    寒假学习计划
    1001 A+B
  • 原文地址:https://www.cnblogs.com/very-beginning/p/13542088.html
Copyright © 2011-2022 走看看