/*
题意:两组单词,求最多可组合成多少新单词。无重复,可为空
思路:字符串的哈希函数处理
*/
#include <cstdio>
#include <cstring>
const int HASH=10000000,nMax=3000000;
int head[HASH],next[nMax];
char one[nMax][30],two[15];
int hash(char *a)
{
int u=0;
while(*a)
{
u=26*u+*a;
a++;
}
return (u & 0x7fffffff)%HASH;//换位与的作用是保证返回值为正,将最高为设为0
}
bool search(int k)
{
int h=hash(one[k]);
bool ok=true;
for(int i=head[h];i!=-1;i=next[i])
if(strcmp(one[i],one[k])==0)
{
ok=false;
break;
}
if(ok)
{
next[k]=head[h];
head[h]=k;
}
return ok;
}
int main()
{
//freopen("data.in","r",stdin);
int T,M,N;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
memset(head,-1,sizeof(head));
scanf("%d%d",&M,&N);//不推荐使用scanf("%d %d\n",&M,&N);格式化容易出错!
getchar();
for(int i=0;i<M;i++)
gets(one[i]);
int k=M;
for(int i=0;i<N;i++)
{
gets(two);
for(int j=0;j<M;j++)
{
strcpy(one[k],one[j]);
strcat(one[k],two);
if(search(k))
k++;
}
}
printf("Case %d: %d\n",cas,k-M);
}
return 0;
}
10887 - Concatenation of Languages(****)字符串的哈希函数处理
最新推荐文章于 2021-02-17 22:32:54 发布