poj2001(字典树)

来源:互联网 发布:centos指令大全 编辑:程序博客网 时间:2024/05/24 00:45

这题存下来离线处理,刚开始只想了在线。。。

现将所有的单词存到一个字典树当中,并记录一个节点有多少单词前缀包含了这个前缀,查询时,若走到一个val==1,及只有它有这个前缀的情况,那么就输出,这便是答案

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>using namespace std;int n,ch[100005][30],val[100005],tot; char a[1005][30];inline int idx(char ch) {return ch-'a';}void insert(char *a){int k=0,len=strlen(a);for (int i=0;i<len;i++){int id=idx(a[i]);if (!ch[k][id]) ch[k][id]=++tot;k=ch[k][id];val[k]++;}}void ask(char *a){int k=0,len=strlen(a);for (int i=0;i<len;i++){printf("%c",a[i]);int id=idx(a[i]);k=ch[k][id];if (val[k]==1) break;}}int main(){while (scanf("%s",a[++n])!=EOF) insert(a[n]);for (int i=1;i<=n;i++){printf("%s ",a[i]);ask(a[i]);printf("\n");}return 0;}


0 0
原创粉丝点击