码迷,mamicode.com
首页 > 其他好文 > 详细

Poj(1220),hash

时间:2016-09-10 01:20:50      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://poj.org/problem?id=1200

这个题,我真是无限MLE,RE,WA,太伤心了,还是写一下吧。题意很简单(英语很好读),最后看了一下金海峰的思路。果然,应该是我的这个hash表有点问题,最好是用正确的算法吧,不乱创造了。karp-rabin把字符串转化成数字的算法,一个字符串有n种字符构成,把每种字符对应为0~n-1中的一个数字,把字母换成对应的数字之后,对于固定长度的串,每个串都与一个唯一的n进制数对应。这样就可以hash了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define maxn 16000005

bool hash[maxn];
int name[260];
int n, nc;
char st[maxn];

int main()
{
    //freopen("t.txt", "r", stdin);
    scanf("%d%d%s", &n, &nc, st);
    memset(name, 0, sizeof(name));
    memset(hash, 0, sizeof(hash));
    int len = strlen(st);
    int t =0;
    for (int i =0; i < len; i++)
        if (name[st[i]] ==0)
            name[st[i]] = t++;
    int temp =0;
    t = nc;
    for (int i =0; i < n -1; i++)
    {
        temp = temp * nc + name[st[i]];
        t *= nc;
    }
    int ans =0;
    for (int i = n -1; i < len; i++)
    {
        temp = (temp * nc + name[st[i]]) % t;
        if (!hash[temp])
        {
            ans++;
            hash[temp] =true;
        }
    }
    printf("%d\n", ans);
    return 0;
}

 

Poj(1220),hash

标签:

原文地址:http://www.cnblogs.com/TreeDream/p/5858442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!