字符串的查找-hash和map

对输入的字符串进行查找。

题目:

ZZACM队的漂亮MM,虽然是一个屌丝ACMer,但是还是有一颗爱美的心。ZZ像所有的女孩子一样,喜欢买各种衣服,可是ZZ有个特别的习惯,就是不买同一个品牌的衣服,可是品牌那么多,怎么辨别哪些买过,哪些没有买过呢?这可难倒了ZZ,同作为ACMer的你,来帮帮ZZ吧!至今为止ZZ已经买过N个品牌的衣服,接下来还要一次一次的买M个品牌的衣服,请你告诉她,哪些能买哪些不能买吧!

 

 

Input

 

题目有多组测试数据,每组测试数据首先输入NM,(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代码如下。

View Code
 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代码如下:
把字符串转化为十进制的数,建立一个链表数组。由于数很大,需要取余,把相同的余数放在同一行。查找时,只要从链表头保存的余数找,然后,再在该行查找。

View Code
 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     

 

 

 

 

posted on 2013-04-29 15:00  青竹士  阅读(688)  评论(0编辑  收藏  举报

导航