banana band bee absolute acm ba b band abc
2 3 1 0
解析:利用字典树求给定公共前缀的字符串个数。(ps:第一次写字典树,还是用的数组,给跪了)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251
代码清单:
#include<map> #include<cmath> #include<stack> #include<queue> #include<ctime> #include<cctype> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; struct edge{ int num; int letter[26]; }trie[50000]; char s[11]; int number=0; void InitTrie(){ for(int i=0;i<50000;i++){ trie[i].num=0; memset(trie[i].letter,0,sizeof(trie[i].letter)); } } void creatTrie(char s[]){ int j=0; int len=strlen(s); for(int i=0;i<len;i++){ if(trie[j].letter[s[i]-'a']){ j=trie[j].letter[s[i]-'a']; trie[j].num++; } else{ trie[j].letter[s[i]-'a']=++number; j=number; trie[j].num=1; } } } int findTrie(char s[]){ int j=0; int len=strlen(s); for(int i=0;i<len;i++){ if(trie[j].letter[s[i]-'a']){ j=trie[j].letter[s[i]-'a']; } else return 0; } return trie[j].num; } int main(){ InitTrie(); //freopen("liuchu.txt","r",stdin); while(gets(s)&&s[0]!='\0') creatTrie(s); while(scanf("%s",s)!=EOF){ printf("%d\n",findTrie(s)); } return 0; }
原文:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/44581219