目标算法:字典树
应用范围:统计拥有相同前缀的字符串
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct Trie{
int cnt;
Trie *next[26];
}Trie;
Trie root;
void createTrie(char *str)
{
int len = strlen(str);
Trie *p = &root;
Trie *q;
for(int i=0;i<len;i++)
{
int id = str[i] - 'a';
if(p -> next[id] == NULL)
{
q = (Trie *)malloc(sizeof(root));
q -> cnt = 1;
for(int j=0;j<26;j++)
{
q -> next[j] = NULL;
}
p -> next[id] = q;
p = p -> next[id];
}
else
{
p -> next[id] -> cnt++;
p = p -> next[id];
}
}
}
int findTrie(char *str)
{
int len = strlen(str);
Trie *p = &root;
for(int i=0;i<len;i++)
{
int id = str[i] - 'a';
p = p -> next[id];
if(p == NULL)
{
return 0;
}
}
return p->cnt;
}
int main()
{
char str[15];
for(int i=0;i<26;i++)
{
root.next[i] = NULL;
}
while(gets(str) && str[0] != '\0')
{
createTrie(str);
}
memset(str,0,sizeof(str));
while(~scanf("%s",str))
{
int ans = findTrie(str);
printf("%d\n",ans);
}
}