poj2001
Posted 探险家Mr.H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2001相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int t[250010][26]; int s[250010],sz; char ch[10500][35]; int n; void add(char* str) { int len=strlen(str); int now=0,k; for(int i=0;i<len;i++) { k=str[i]-‘a‘; if(!t[now][k])t[now][k]=++sz; now=t[now][k]; s[now]++; } } void ask(char* str) { int len=strlen(str); int now=0,k; for(int i=0;i<len;i++) { if(s[now]==1)return; k=str[i]-‘a‘; printf("%c",str[i]); now=t[now][k]; } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",ch[i]); add(ch[i]); } for(int i=0;i<n;i++) { printf("%s ",ch[i]); ask(ch[i]); printf("\n"); } }
数组记录的Trie树
k表示字符串第i个字符 now表示现在树记到的位置 now的转移每次都是now=t[now][k]
sz记录树的大小
s[now]表示有多少个单词经过now这个点
以上是关于poj2001的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2001 Shortest Prefixes (Trie)