样例
样例输入
4
add Inside C#
find Effective Java
add Effective Java
find Effective Java
样例输出
no
yes
数据范围与提示
n<=30000
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 using namespace std; 6 typedef long long ll; 7 const int mod1=1e6+3,mod2=1e6+9,p1=47,p2=79,N=30020; 8 int k,to[N],endd[N]; 9 int first[mod1+20];//注意poi数组开的大小范围,不是N 10 char a[10],b[220]; 11 12 void add(int x,int y)//邻接表实现该操作 13 { 14 to[k]=first[x]; 15 first[x]=k; 16 endd[k]=y; 17 k++; 18 } 19 20 int query(int x,int y) 21 { 22 for(int i=first[x]; i!=-1; i=to[i]) 23 { 24 if(endd[i]==y) 25 return 1;//该字符串找到了 26 } 27 return 0; 28 } 29 30 int main() 31 { 32 int t; 33 scanf("%d",&t); 34 memset(to,-1,sizeof(to));//最好用-1进行清空,因为有时侯点会从0开始,会导致多存 35 k=1;//k最好是从1开始存,否则容易出错 36 while(t--) 37 { 38 scanf("%s",a); 39 gets(b); 40 int lb=strlen(b); 41 int sum1=0,sum2=0; 42 for(int i=0; i<lb; i++) //计算出每个书名的哈希值 43 { 44 //双哈希思想,减小误差 45 sum1=(sum1*p1+b[i])%mod1; 46 sum2=(sum2*p2+b[i])%mod2; 47 } 48 if(strcmp(a,"add")==0)//add操作,该操作单向即可,不需要add(sum2,sum1) 49 add(sum1,sum2); 50 else //寻找是否出现过该书 51 { 52 int w=query(sum1,sum2); 53 if(w) 54 printf("yes\n"); 55 else 56 printf("no\n"); 57 } 58 } 59 return 0; 60 }
原文地址:https://www.cnblogs.com/OFSHK/p/11703665.html
时间: 2024-11-07 14:08:51