poj3274 hash数组

本文介绍了一种使用C++实现的数据匹配算法,通过哈希表和位操作优化了匹配效率,解决了大规模数据集中的高效匹配问题。文中详细阐述了算法的设计思路、关键步骤及其实现细节,为解决类似问题提供了实用的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100001
#define Prime 99983
using namespace std;
int n, k, flag[N][31], c[N][31], hash[Prime];
inline int hashcode(const int *v)
{
        int s = 0;
        for(int i = 0; i < k; i++)
                s=((s << 2) + (v[i] >> 4)) ^ (v[i] << 10);
        s = s % Prime;
        s = s < 0 ? s + Prime : s;
        return s;
}
int main()
{
        int i, j, tmp, maximum = 0;

        scanf("%d%d", &n, &k);

        memset(flag, 0, sizeof(flag));
        memset(c, 0, sizeof(c));
        memset(hash, -1, sizeof(hash));

        hash[hashcode(c[1])] = 0;
        for (i = 1; i <= n; i++)
        {
                scanf("%d", &tmp);
                for (j = 0; j < k; j++)
                {
                        if ((tmp >> j) & 1)     flag[i][j] = flag[i - 1][j] + 1;
                        else flag[i][j] = flag[i - 1][j];
                        c[i][j] = flag[i][j] - flag[i][0];
                }
                tmp = hashcode(c[i]);
                while (hash[tmp] != -1)
                {
                        for (j = 1; j < k; j++)
                                if (c[i][j] != c[hash[tmp]][j]) break;
                        if (j >= k)
                        {
                                j = i - hash[tmp];
                                maximum = maximum > j ? maximum : j;
                                break;
                        }
                        tmp++;
                }
                if (hash[tmp] == -1) hash[tmp] = i;
        }
        printf("%d\n", maximum);
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值