HRBUST 1987 逃课的孩子

2014-11-24 03:15:45 · 作者: · 浏览: 2

Sol:HASH + 二分 字符串处理,很基础的操作。

题意很明确就是找重复的次数统计下,范围比较大1≤n≤10000,1≤m≤10000。


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int maxm = 10000 + 10; const int maxn = 10 + 10; const int EXP = 52; int n,m; long long list[maxm]; char str[maxn]; long long hash(char *str,int len) { long long res=0; long long tmp; for(int i=0;i
       
        ='A'&&str[i]<='Z') tmp=str[i]-'A'; if(str[i]>='a'&&str[i]<='z') tmp=str[i]-'a'+26; res=res*EXP+tmp; } return res; } bool Bin_search(int L,int R,long long val) { int mid; while(L<=R) { mid=(L+R)>>1;// / 2 if(list[mid]==val) return true; if(list[mid]>val) R=mid-1; else L=mid+1; } return false; } int main() { while(~scanf("%d%d",&n,&m)) { int cnt=1; list[0]=-1; for(int i=1;i<=n;i++) { scanf("%s",str); int len1=strlen(str); list[cnt++]=hash(str,len1); } sort(list,list+n+1); for(int i=1;i<=m;i++) { scanf("%s",str); int len2=strlen(str); if(Bin_search(1,cnt,hash(str,len2))) printf("yes\n"); else printf("no\n"); } } return 0; }