标签:
之前去省赛打酱油,遇到一题二进制相关的题目,当时都没做出。后来几个学长找规律打表,然后做;老族长说要用到字典树思想。
也应该学习学习字典树。随手拿水题,看题解,看代码,还是懂了字典树;
内存消耗真的大。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 26//26个字母
struct trie
{
trie *next[maxn];//向下26个字母扩展
int v;//记录个数
};
trie *root;
void init()
{
root=(trie*)malloc(sizeof(trie));
for(int i=0;i<maxn;i++)
root->next[i]=NULL;
root->v=0;
}
void creattrie(char *str)
{
trie *p,*q;
p=root;
int i,j;
int len=strlen(str);
for(i=0;i<len;i++)
{
int id=str[i]-‘a‘;
if(p->next[id]==NULL)
{
q = (trie *)malloc(sizeof(trie));
q->v=0;
for(j=0;j<maxn;j++)
q->next[j]=NULL;
p->next[id]=q;
}
p=p->next[id];
p->v++;//次数增加
}
}
int query(char *str)
{
int i,j;
int len=strlen(str);
trie *p=root;
for(i=0;i<len;i++)
{
int id=str[i]-‘a‘;
if(p->next[id]==NULL)
return 0;
p=p->next[id];
}
return p->v;
}
int main()
{
char str[15];
int i,j;
init();
while(gets(str))
{
if(strcmp(str,"")==0)break;
creattrie(str);
}
while(gets(str))
{
if(strcmp(str,"")==0)break;
printf("%d\n",query(str));
}
}
标签:
原文地址:http://www.cnblogs.com/sweat123/p/4687769.html