题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=111&page=show_problem&problem=1828
/* 题意:两组单词,求最多可组合成多少新单词。无重复,可为空 思路:字符串的哈希函数处理 */ #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; }