UVA 12506(字典树)

来源:互联网 发布:js 日期格式化 编辑:程序博客网 时间:2024/05/17 21:39



题意:给你n个字符串,问每个字符串的唯一最短前缀的长度总和是多少?



题解:很容易想到字典树,统计每个字母的出现次数,递归到每个单词的次数为1的位置,加上递归的层数就OK了,其实就是字典树的小变形



#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<map>#include<set>#include<utility>using namespace std;#define LL long long #define N int(1e6+10)#define lson L,mid,rt<<1#define rson mid+1,R,rt<<1|1char s[N];int ans;struct trie{int value;trie *child[30];trie(){value=0;memset(child,NULL,sizeof(child));}}*root;void insert(char *s){trie *x=root;for(int i=0;s[i];i++){int pos=s[i]-'a';if(x->child[pos]==NULL){x->child[pos]=new trie;}x=x->child[pos];x->value++;}}void deal(trie *x){if(x==NULL)return ;for(int i=0;i<26;i++){if(x->child[i]!=NULL){deal(x->child[i]);}}}void dfs(trie *x,int level){if(x==NULL){return;}if(x->value==1){ans+=level;return ;}for(int i=0;i<26;i++){if(x->child[i]!=NULL){dfs(x->child[i],level+1);}}}int main (){#ifdef CDZSCfreopen("i.txt","r",stdin);#endifint n,t;scanf("%d",&t);while(t--){ans=0;root=new trie;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",s);insert(s);}dfs(root,0);deal(root);printf("%d\n",ans);}return 0;}


0 0