Shortest Prefixes 字典树模板

Posted qq2210446939

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shortest Prefixes 字典树模板相关的知识,希望对你有一定的参考价值。

题意

  给你一堆字符串,要求找到每个字符串的唯一标识前缀,输出原字符串和唯一标识前缀。

思路

  用这堆字符串建字典树,对于每个字符串,我们进行一次查找,若当前位置的cnt为1,就代表从根到现在的位置能唯一标识。

AC代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=1e3+5;
int t,n;
char str[maxn][25];
struct node{
    int cnt;
    struct node *next[26];
    node(){
        cnt=0;
        memset(next,0,sizeof(next));
    }
};
node *root;
void buildtrie(char *s){
    node *p=root;
    node *tmp=NULL;
    int len=strlen(s);
    for(int i=0;i<len;i++){
        if(p->next[s[i]-a]==NULL){
            tmp=new node;
            p->next[s[i]-a]=tmp;
        }
        p=p->next[s[i]-a];
        p->cnt++;
    }
}
void findtrie(char *s){
    node *p=root;
    int len=strlen(s);
    for(int i=0;i<len;i++){     
        p=p->next[s[i]-a];
        printf("%c",s[i]);
        if(p->cnt==1){
            return;
        }
    }    
}
void del(node *root){
    for(int i=0;i<26;i++){
        if(root->next[i])
            del(root->next[i]);
    }
    delete(root);
}
int main()
{
    root=new node;
    int k=0;
    while(~scanf("%s",&str[k])){
        buildtrie(str[k]);
        k++;
    }
    for(int i=0;i<k;i++){
        printf("%s ",str[i]);
        findtrie(str[i]);
        printf("
");
    }
    return 0;
}

 

以上是关于Shortest Prefixes 字典树模板的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2001 Shortest Prefixes (Trie)

KMPnxt数组应用POJ2001Shortest Prefixes

统计难题HDU - 1251map打表或字典树字典树模板

字典树(模板

字典树数组模板

cf842D 01字典树|线段树 模板见hdu4825