HDU 4821 (hash)

这道题最重要的不仅是hash这种算法,更要学会利用好STL中的<map>才行。

将连续的L个字符经过hash赋值,最后线性判断。其中的判断步骤用到了map的插入特性。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
#define maxn 500010
#define ull unsigned long long

ull sum[maxn];
map<ull, bool> mp;
ull l, m;

int solve(ull be, ull len)
{
    int ret = 0;
    mp.clear();
    for(ull i = be; i < len; i += l)
    {
        if(mp[sum[i]])
        {
            while(sum[be] != sum[i])
            {
                mp[sum[be]] = 0;
                be += l;
            }
            mp[sum[be]] = 0;
            be += l;
        }
        mp[sum[i]] = 1;
        if((i - be) / l == m - 1)
        {
            ret++;
            mp[sum[be]] = 0;
            be += l;
        }
    }
    return ret;
}

int main()
{
    char c[maxn];
    while(~scanf("%d%d", &m, &l))
    {
        scanf("%s", c);
        ull len = strlen(c);
        ull base = 31;
        ull bit = 1;
        ull tmp = 0;
        for(ull i = 0; i < l; i++)
        {
            tmp = tmp * base + c[i] - ‘a‘;
            bit *= base;
        }
        int ans = 0;
        sum[l - 1] = tmp;
        for(ull i = l; i < len; i++)
        {
            sum[i] = sum[i - 1] * base + c[i] - ‘a‘  - bit * (c[i - l] - ‘a‘);
        }
        for(ull i = l - 1; i < l * 2 - 1; i++)
        {
            ans += solve(i, len);
        }
        printf("%d\n", ans);

    }
}

HDU 4821 (hash)

时间: 2024-12-09 10:55:18

HDU 4821 (hash)的相关文章

hdu 5183(hash)

传送门:Negative and Positive (NP) 题意:给定一个数组(a0,a1,a2,?an−1)和一个整数K, 请来判断一下是否存在二元组(i,j)(0≤i≤j<n)使得 NP−sum(i,j) 刚好为K.这里NP−sum(i,j)=ai−ai+1+ai+2+?+(−1)j−iaj. 分析:根据a[i]的i为奇偶进行hash,维护两种前缀和 1)i为奇数开头:sum=a[i]-a[i+1]+a[i+2]... 2)i为偶数开头:sum=a[i]-a[i+1]+a[i+2]...

hdu 1029(hash)

传送门:Ignatius and the Princess IV 题意:给n个数,找出出现次数大于等于(n+1)/2的那个数. 分析:大水题,排个序输出中间那个即可,这里随便写个HASHMAP找出次数最大那个. #include <algorithm> #include <cstdio> #include <cstring> #define N 1000010 #define inf 0x3f3f3f3f using namespace std; const int H

hdu 4886 TIANKENG’s restaurant(Ⅱ) (hash)

题目大意: 求出在文本串中第一个没出现的字典序最小的串.. 思路分析: 开始的时候 用后缀数组写,然后根据sa的有序性.你就可以知道哪个串没有出现了. 但是题目卡了倍增哦... 自习想一想的话,我们用 sa 数组,也就是想知道这个串有没有出现过,也就是判断重复,却浪费了  O (n * lg n)... 判断重复为什么没想到hash . 把每一个长度的子串都hash 出来,用八进制表示,这样的话就可以得到一个递增的hash值. 将之存入hash 数组.找到第一个空的hash的下标,就是第一个没出

hdu 1874(Dijkstra )

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692    Accepted Submission(s): 10019 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路

哈希(Hash)与加密(Encrypt)相关内容

1.哈希(Hash)与加密(Encrypt)的区别 哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可逆的密文. i.哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关. 例:设我们有两段文本:"Microsoft"和"Google".两者使用某种哈希算法得到的结果分别为:"140864078AECA1C7C35B4BEB

hdu 4194(模拟)

符合三者之一的则不满足规定,求不满足规定的个数.直接模拟. 1.被同一个人审查多次 2.被和自己同一组织的审查 3.被审查次数不等于k 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 17:36 5 * Filename :

hdu 4196(数论)

题意:问小于n的数的乘积能拼成的最大平方数是多少? 思路:给n!做质数分解在除去指数为奇数的那些质数,由于题目中需要模运算所以不能直接除,必须乘上摸逆. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 15:26 5 * Fi

Hdu 1402 (FFT)

题目链接 A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12490    Accepted Submission(s): 2206 Problem Description Calculate A * B. Input Each line will contain two integers A and

HDU 1695(GCD)

GCD Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common