POJ 1200 Crazy Search

来源:互联网 发布:易语言界面源码 编辑:程序博客网 时间:2024/06/16 14:53

题目传送门

【题意】给了一个字符串,和n,m,这字符串里最多有m个不同的字符,现在要求有多少个长度为n且不同的字串。

【坑点】一直在看数据范围,题上 怎么没给呀,只给了字符串长度的数据范围,最后看Disscuss里面的人说,input里解释了一切,果然input里的不超过16M说明了一切,解决了这个问题就很好解决了,把每一个长度为n的字符串hash成一个m进制的整数,然后判重并记录次数。

【AC代码】

#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <iostream>using namespace std;#define N 1000100#define M 500000const int maxnum=1600000;char str[maxnum];bool arr[20000000];int has[256];int main(){    int n,nc;    int i,cnt,len,sum,j,res;    while(scanf("%d%d%s",&n,&nc,str)!=EOF)    {        cnt=0;        memset(has,0,sizeof(has));        memset(arr,false,sizeof(arr));        len=strlen(str);        for(i=0;i<len;i++)            if(has[str[i]]==0)               has[str[i]]=cnt++;        res=0;        for(i=0;i+n<=len;i++)        {            sum=0;            for(j=i;j<i+n;j++)            {                sum*=nc;                sum+=has[str[j]];            }            if(!arr[sum])            {                res++;                arr[sum]=true;            }        }        printf("%d\n",res);    }    return 0;}

0 0