Chinaunix首页 | 论坛 | 博客
  • 博客访问: 474241
  • 博文数量: 117
  • 博客积分: 3195
  • 博客等级: 中校
  • 技术积分: 1156
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 01:44
文章分类

全部博文(117)

文章存档

2012年(5)

2011年(5)

2010年(46)

2009年(61)

我的朋友

分类:

2009-09-01 11:00:48

Memory: 30476K Time: 79MS

解题思路

题意:

    N是子串的长度,NC是原串中所含的不同字母的个数,求的是text中长度为N的不相同的子串有多少个。

 

思路:

   刚开始接触hash,还不懂用,参考了网上别人的思路。用nc进制的hash。先把每个不同的字母对应一个整数,在in数组里,所谓nc进制的hash就是

sum = ((sum * nc)+ in[text[i]] ) %  N

源程序

 

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 16000000
int hash[N], in[125];
char text[N];

int main()
{
    int i, j, k,len, count, sum;
    int n, nc;

    freopen("in.txt", "r", stdin);
    scanf("%d%d", &n, &nc);
    scanf("%s", text);

    i=0;
    k = 1;
    while(text[i] != '\0')
    {
        if(in[text[i]] == 0)
            in[text[i]] = k++; //每个不同的字母对应一个整数,从1到nc

        if(k == nc+1) //找完所有不同的字母后跳出
            break;
        i++;
    }
    len = strlen(text);
    count = len-n+1; //如果所有的N长度的子串都不相同的话有count个

    for(i=0; i<len-n+1; i++)
    {
        sum = 0;
        for(j=i; j<i+n; j++)
        {
            sum = (sum * nc) + in[text[j]]; //nc进制hash
        }
        sum = sum % N;
        if(hash[sum] == 0) //如果不在设为在
            hash[sum] = 1;
        else count--; //如果在了个数减一
    }
    printf("%d\n", count);
    getch();
    return 0;
}

阅读(2021) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~