传送门UVa 10887 - Concatenation of Languages
题意是给两个集合,求A +B后的不同的个数。
用哈希解决。
不过之前哈希表的大小开小了,找了好久找不出原因。。。(╯‵□′)╯ ┴─┴
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1600;
const int HashSize = 3000000;
char astr[MAXN][12];
char result[MAXN * MAXN][30];
int head[HashSize], next[HashSize];
int BKDHash(char *s);
bool TryToInsert(int s);
void Initial();
int main()
{
//freopen("input.txt", "r", stdin);
int an, bn, i, j, T, k, cnt, cases = 1;
scanf("%d", &T);
while (T--)
{
k = 1, cnt = 0;
memset(head, 0, sizeof(head));
scanf("%d%d%*c", &an, &bn);
for (i = 0; i < an; i++)
gets(astr[i]);
char str[12];
for (i = 0; i < bn; i++)
{
gets(str);
for (j = 0; j < an; j++)
{
char temp[40];
strcpy(temp, astr[j]);
strcat(temp, str);
strcpy(result[k], temp);
if (TryToInsert(k)) //if the new word 还没出现过
cnt++, k++;
}
}
printf("Case %d: %d\n", cases++, cnt);
}
return 0;
}
int BKDHash(char *s)
{
int seed = 131;
int value = 0;
for (int i = 0; i < strlen(s); i++)
value = value * seed + s[i];
return (value & 0x7FFFFFFF) % HashSize;
}
bool TryToInsert(int s)
{
int v = BKDHash(result[s]);
int u = head[v];
while (u)
{
if (strcmp(result[s], result[u]) == 0)
return false;
u = next[u];
}
next[s] = head[v];
head[v] = s;
return true;
}