poj_1200_Crazy Search_hash

来源:互联网 发布:同业拆借 知乎 编辑:程序博客网 时间:2024/06/16 08:00

题目大意

在一个字符串中找到长度为n的不同子串的个数

思路

可以将每一个子串的化成一个独一无二的数存在hash中,然后暴力一下判重就可以了
O(n*m)

#include <stdio.h>#include <string.h>#include <stdlib.h>#define M 16000000using namespace std;int h[M];char s[M];int a[100000];int main(){    int n,nc;    scanf("%d%d",&n,&nc);    scanf("%s",&s);    int len=strlen(s);    int x=0;    for (int i=0;i<=len-1;i++)    {        if (a[s[i]]==0)        {            x++;            a[s[i]]=x;        }    }    int ans=0;    for (int i=0;i<len-n+1;i++)    {        int st=0;        for (int j=i;j<i+n;j++)            st=st+st*nc+a[s[j]];        if (h[st]==0)        {            ans++;            h[st]=1;        }    }      printf("%d\n",ans);    return 0;}
1 0