【第22期】观点:IT 行业加班,到底有没有价值?

[POJ 1200] Crazy Search (水题)

原创 2016年08月30日 20:31:30

链接

POJ 1200


题意

给出整数N和NC,给出字符串,字符串的字符集大小为NC,求该字符串长度为N的子串种类。


思路

字符串哈希的裸题,对长度为N的子串求哈希值,存储并判重即可。


代码

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef unsigned long long ulint;

#define maxn (40000000)
bool vis[maxn];

char s[1000000];
int xp[1000000];
int slen, w[256];

int N, NC;
int cal()
{
    int h = 0, ans = 0;
    for(int i = 0; i < N; i++)
    {
        h *= NC;
        h += w[s[i]];
    }
    ans++;
    vis[h] = true;

    for(int i = N; i < slen; i++)
    {
        h = (h - w[s[i-N]] * xp[N-1]) * NC + w[s[i]];
        if(!vis[h])
        {
            vis[h] = true;
            ans++;
        }
    }
    return ans;
}

int main()
{
    //freopen("1200.txt", "r", stdin);

    while(cin >> N >> NC)
    {
        if(!N)
        {
            cout << 0 << endl;
            continue;
        }

        xp[0] = 1;
        for(int i = 1; i < N; i++)
        {
            xp[i] = xp[i-1] * NC;
        }

        scanf("%s", s);
        slen = strlen(s);
        memset(w, -1, sizeof(w));
        memset(vis, false, sizeof(vis));

        int cnt = 0;

        for(int i = 0; i < slen; i++)
        {
            if(w[s[i]] < 0) w[s[i]] = cnt++;
        }

        cout << cal() << endl;
    }
    return 0;
}
版权声明:想转就转吧,反正也是人人都会的东西:-( 举报

相关文章推荐

POJ-1200 Crazy Search,人生第一道hash题!

Crazy Search     真是不容易啊,人生第一道hash题竟然是搜博客看题解来的。        题意:给你一个包含m种字符的字符串,求长度为n的不同子串有多少个。     将每个字串化为...

[字符串hash]poj 1200:Crazy Search

大致题意:    给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的子串有多少种。   大致思路:    裸哈希之,将长度为n的子串看作 n位的 nc进制数,将问题转化为共有多少种数字。 #include&a...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

POJ 上网上搜到的总结帖

POJ 上网上搜到的zongjieti 原帖: 一些图论、网络流入门题总结、汇总 http://hi.baidu.com/zfy0701/blog/item/b8332b5c7b2dd545...

POJ1083,水题

这道题思路还是很简单的:因为要求至少要用多少时间,那么就要求出哪个子走廊要用到的次数最多,重叠次数最多的即所求答案,于是用一个计数器数组flag[]记录经过过房间的次数,最后flag中的最大值既结果。 但是需要注意的有两点, 1.如果开始的房间数是偶数,则要将区间起点-1,如果结束的房间号是奇数...

POJ 1200 Crazy Search hash水题

好像ELFhash过不了啊,换了个hash函数过了 #include #include #include #define maxn 16000000 char s[maxn]; int a[10...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)