poj 2001 Shortest Prefixes(字典树)

来源:互联网 发布:淘宝优惠券可以转赠吗 编辑:程序博客网 时间:2024/03/28 23:07

题目链接:poj2001

题目大意:给出一些字符串  ,求最短的区别前缀(即这个前缀是独一无二的且要尽可能小)

思路:只要在字典树上记录所有的节点的记录次数,这个时候只要查到一个次数只有1的时候就可以了。

因为1的是时候说明只有一个单词的前缀经过。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{node *nxt[26];int flag;node()//构造函数{for(int i=0;i<26;i++){nxt[i]=NULL;}flag=0;}};node * root;void init()//初始化根节点{root=new node();}void ins (char *s){int len=strlen(s);node *now=root;//指向根节点for(int i=0;i<len;i++){int to=s[i]-'a';if(now->nxt[to]==NULL)now->nxt[to]=new node();now=now->nxt[to];//now指向新生成的结点now->flag++;}}int fid (char *s){int len=strlen(s);node *now=root;//指向根节点for(int i=0;i<len;i++){int to=s[i]-'a';if(now->nxt[to]==NULL)return -1;now=now->nxt[to];//now指向新生成的结点if(now->flag==1)return i;}return len-1;}char s[1100][25];int main(){init();int cnt=0;while(~scanf("%s",s[cnt])){ins(s[cnt]);cnt++;}for(int i=0;i<cnt;i++){int ans=fid(s[i]);printf("%s ",s[i]);for(int j=0;j<=ans;j++)printf("%c",s[i][j]);printf("\n");}return 0;}

原创粉丝点击