链式hash表

给出nm个字符串,进行nm次连接,输出连接后的字符串有几种
传送门
对于插入,查询字符串的种类有几个操作

scanf不能输入\0要用gets()
scanf不能输入string要用cin
hash,next都是关键词
由于hash的数目很大

链式hash

/*链式哈希表
*/
#include 
#include 
#include 
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e6;
int n,m;
string str1[maxn];
string str2[maxn];
string allstr[maxn];
int head[maxn],Next[maxn];
int ans,cnt;
int gethash(string str){
    int seed=131;//哈希基底
    int hashvalue=0;//哈希值
    for(int i=0;i>str1[i];//不能用scanf,因为string不是%s
        }
        rep(i,1,m){
            cin>>str2[i];
        }
        string str;
        rep(i,1,n){
            rep(j,1,m){
                str=str1[i]+str2[j];
                allstr[cnt]=str;
                if(insert_table(cnt))ans++;//插入成功
                cnt++;
            }
        }
        printf("Case %d: %d\n",k,ans);
    }
    return 0;
}

同时,对于set也可以实现该操作

set

#include 
#include 
#include 
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e6;
set s;
string str1[maxn];
string str2[maxn];
void init(){
    s.clear();
}
int main(){
    int t;
    scanf("%d",&t);
    rep(k,1,t){
        init();
        int n,m;
        scanf("%d%d",&n,&m);
        rep(i,1,n){
            cin>>str1[i];
        }
        rep(i,1,m){
            cin>>str2[i];
        }
        string str;
        rep(i,1,n){
            rep(j,1,m){
                str=str1[i]+str2[j];
                s.insert(str);
            }
        }
        printf("Case %d: %d\n",k,s.size());
    }
}

你可能感兴趣的:(链式hash表)