水题,可以用map做也可以用hash做,当然hash要快的多。
值得注意的是题目中输入的串可能是空串,这一点在题目中是没有说明的。
我就因为这个WA了好几次。还有就是读入的时候注意gets使用时,前面的回车
记得“吃掉“(使用%*c)。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
#define Mod 2299963
#define maxn 2300000
int a[maxn];
char vis[maxn][20];
int BKDRHash(char *str)
{
int seed=31;
int sum=0;
while(*str)
sum=sum*seed+(*str++);
sum=sum&0x7fffffff;
return sum%Mod;
}
int Insert(char *str)
{
int h=BKDRHash(str);
while(a[h])
{
if(strcmp(vis[h],str)==0)
return 0;
h++;
}
a[h]=1;
strcpy(vis[h],str);
return 1;
}
int main()
{
map<string,int>M;
char str1[2000][20],str2[2000][20];
int i,j,k,n,m,t,Case=0;
scanf("%d%*c",&t);
while(t--)
{
M.clear();
memset(a,0,sizeof(a));
int ans=0;
scanf("%d%d%*c",&m,&n);
for(i=0;i<m;i++)
gets(str1[i]);
for(i=0;i<n;i++)
gets(str2[i]);
for(i=0;i<m;i++)
{
char temp[30] = {'\0'};
for(j=0;j<n;j++)
{
strcpy(temp,str1[i]);
strcat(temp,str2[j]);
/*M[temp]++;
if(M[temp]==1)
ans++;*/
if(Insert(temp))
ans++;
}
}
printf("Case %d: %d\n",++Case,ans);
}
return 0;
}