字符串的查找-hash和map
对输入的字符串进行查找。
题目:
ZZ是ACM队的漂亮MM,虽然是一个屌丝ACMer,但是还是有一颗爱美的心。ZZ像所有的女孩子一样,喜欢买各种衣服,可是ZZ有个特别的习惯,就是不买同一个品牌的衣服,可是品牌那么多,怎么辨别哪些买过,哪些没有买过呢?这可难倒了ZZ,同作为ACMer的你,来帮帮ZZ吧!至今为止ZZ已经买过N个品牌的衣服,接下来还要一次一次的买M个品牌的衣服,请你告诉她,哪些能买哪些不能买吧!
Input
题目有多组测试数据,每组测试数据首先输入N和M,(0<=n,m<=100000)随后输入N个品牌,表示N个已经买过的品牌,紧跟着又有M个品牌,表示将要买的M个品牌。(品牌只由小写字母组成,长度不超过20)
Output
对于M个要买的品牌,如果能买,输出YES,否则输出NO,每个输出占一行。
Sample Input
2 3 he she me she it
Sample Output
YES NO YES
若对STL中的map和set熟悉,本题很容易解决。
用map代码如下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<iterator> 5 using namespace std; 6 int main() 7 { 8 int n,m; 9 char t[25]; 10 map<string,int> mp; 11 map<string,int>::iterator it; 12 while(~scanf("%d%d",&n,&m)) 13 { 14 mp.clear(); 15 for(int i=0;i<n;i++) 16 { 17 scanf("%s",t); 18 mp[t]=1; 19 } 20 for(int i=0;i<m;i++) 21 { 22 scanf("%s",t); 23 if(mp[t]) 24 printf("NO\n"); 25 else 26 { 27 mp[t]=1; 28 printf("YES\n"); 29 } 30 } 31 } 32 return 0; 33 }
用hash代码如下:
把字符串转化为十进制的数,建立一个链表数组。由于数很大,需要取余,把相同的余数放在同一行。查找时,只要从链表头保存的余数找,然后,再在该行查找。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #define mod 200005 4 using namespace std; 5 typedef unsigned long long INT; 6 struct node{ 7 int x,next; 8 INT m; 9 }q[200005]; 10 int head[200005]; 11 int idx; 12 INT count(char *st) 13 { 14 int k=strlen(st); 15 INT sum=0; 16 for(int i=0;i<k;i++) 17 { 18 sum=sum*29+st[i]-'a'+1; 19 } 20 return sum; 21 } 22 void insert(int x,INT m) 23 { 24 q[idx].x=x;q[idx].m=m; 25 q[idx].next=head[x]; 26 head[x]=idx++; 27 } 28 void encount(char *st) 29 { 30 INT val=count(st); 31 int x=val%mod; 32 insert(x,val); 33 } 34 bool search(char *st) 35 { 36 INT val=count(st); 37 int k=val%mod; 38 for(int i=head[k];i!=-1;i=q[i].next) 39 { 40 if(q[i].m==val) 41 return true; 42 } 43 return false; 44 } 45 int main() 46 { 47 char s[25]; 48 int n,m; 49 while(~scanf("%d%d",&n,&m)) 50 { 51 idx=0; 52 memset(head,0xff,sizeof(head)); 53 for(int i=0;i<n;i++) 54 { 55 scanf("%s",s); 56 encount(s); 57 } 58 for(int i=0;i<m;i++) 59 { 60 scanf("%s",s); 61 if(search(s)) 62 { 63 puts("NO"); 64 } 65 else 66 { 67 puts("YES"); 68 encount(s); 69 } 70 } 71 } 72 return 0; 73 } 74 75