RY哥查字典
题目描述:
RY哥最近新买了一本字典,他十分高兴,因为这上面的单词都十分的和谐,他天天查字典。
输入描述:
1个整数N,表示字典里面的单词数量。
接下来N行,每行一个字符串,表示一个单词。
然后第N+2行,一个整数M,表示要查的单词数。
接下来M行,每行一个字符串,表示一个要查的单词。
输出描述:
对于每一个要查的单词,如果在字典里面,就输出’Yes’,否则输出’No’,一行一个。
样例输入:
2
i
you
1
love
样例输出:
No
数据范围及提示:
1
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=10010;
const int f1=13;
const int f2=17;
struct node
{
int to;
int next;
}e[maxn];
int n,tot,head[maxn];
char c[110];
int get_hash_1(char s[110])
{
int tmp=0;
for(int i=0;i<strlen(s);i++)
tmp=(tmp+(s[i]-96)*f1%10007);
return tmp%10007;
}
int get_hash_2(char s[110])
{
int tmp=0;
for(int i=0;i<strlen(s);i++)
tmp=(tmp+(s[i]-96)*f2%521);
return tmp%521;
}
void add_edge(int u,int v)
{
tot++;
e[tot].to=v;
e[tot].next=head[u];
head[u]=tot;
}
bool find(int u,int v)
{
for(int i=head[u];i;i=e[i].next)
if(e[i].to==v)
return true;
return false;
}
int main()
{
int x,y;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c;
x=get_hash_1(c);
y=get_hash_2(c);
add_edge(x,y);
}
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c;
x=get_hash_1(c);
y=get_hash_2(c);
if(find(x,y))
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}