题目:
P1935【Trie】图书管理员 | |
|
问题描述
你是一所学校的图书管理员,你的工作有如下几种操作:
A.添加一本书
B.借出一本书
C.查找一本书
你这学期要完成n次操作,非常辛苦,你想编写一个程序来帮助你。
输入格式
第一行一个整数n,表示操作的次数。
接下来n行,每行由一个大写字母和一个单词构成,大写字母表示操作的种类,单词表示对应的书名
输出格式
对于每次查询,输出查询的结果,找到输出"yes",没找到输出"no"。
样例输入
10
A zerow
A alien
A newton
B jack
A nicole
C newton
B nicole
A pugna
C alien
C zerowb
样例输出
yes
yes
no
提示
0<=n<=200000
显然,这是一道字典树的题,别问我怎么看出来的,这是道模板题........
直接贴代码
1. 非指针版
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node
{
int Num;
int Next[26];
};
node trie[1000001];
char a[1000];
int n,m,tot;
void Insert(char* c);
void Delete(char* c);
void Find(char* c);
int main()
{
int k,ans;char t;
cin>>m;
for(k=1;k<=m;k++)
{
t=getchar();
while(t<'A'||t>'C')t=getchar();
scanf("%s",a);
if(t=='A')Insert(a);
if(t=='B')Delete(a);
if(t=='C')Find(a);
}
return 0;
}
void Insert(char* c)
{
int i,t,len,p=0;
len=strlen(c);
for(i=0;i<len;i++)
{
t=c[i]-'a';
if(trie[p].Next[t]==0)
{
tot++;
p=trie[p].Next[t]=tot;
trie[p].Num=0;
}
else p=trie[p].Next[t];
}
trie[p].Num++;
}
void Delete(char* c)
{
int i,t,len,p=0;
len=strlen(c);
for(i=0;i<len;i++)
{
t=c[i]-'a';
if(trie[p].Next[t]==0)return;
p=trie[p].Next[t];
}
if(trie[p].Num>0)trie[p].Num--;
}
void Find(char* c)
{
int i,t,len,p=0;
len=strlen(c);
for(i=0;i<len;i++)
{
t=c[i]-'a';
if(trie[p].Next[t]==0){printf("no\n");return;}
p=trie[p].Next[t];
}
if(trie[p].Num<=0)printf("no\n");
else printf("yes\n");
}
2.指针版
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node
{
int Num;
node *Next[26];
node():Num(0){for(int i=0;i<26;i++)Next[i]=NULL;}
};
node *head=new node;
char a[1000];
int n,m,tot=0;
void Insert(char* c);
void Delete(char* c);
void Find(char* c);
int main()
{
int k,ans;char t;
cin>>m;
for(k=1;k<=m;k++)
{
t=getchar();
while(t<'A'||t>'C')t=getchar();
scanf("%s",a);
if(t=='A')Insert(a);
if(t=='B')Delete(a);
if(t=='C')Find(a);
}
return 0;
}
void Insert(char* c)
{
int i,t,len;
node* p=head;
len=strlen(c);
for(i=0;i<len;i++)
{
t=c[i]-'a';
if((*p).Next[t]==NULL)
{
p=(*p).Next[t]=new node;
(*p).Num=0;
}
else p=(*p).Next[t];
}
(*p).Num++;
}
void Delete(char* c)
{
int i,t,len;
node* p=head;
len=strlen(c);
for(i=0;i<len;i++)
{
t=c[i]-'a';
if((*p).Next[t]==0)return;
p=(*p).Next[t];
}
if((*p).Num>0)(*p).Num--;
}
void Find(char* c)
{
int i,t,len;
node* p=head;
len=strlen(c);
for(i=0;i<len;i++)
{
t=c[i]-'a';
if((*p).Next[t]==0){printf("no\n");return;}
p=(*p).Next[t];
}
if((*p).Num<=0)printf("no\n");
else printf("yes\n");
}