UVa 10887 - Concatenation of Languages

77 篇文章 0 订阅
26 篇文章 0 订阅

传送门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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值