【字符串RK匹配】POJ 1200

来源:互联网 发布:淘宝网禁止出售滥用 编辑:程序博客网 时间:2024/04/29 12:34

转换为nc进制!

复杂度O(len)。

#include <stack>#include <map>#include <string>#include <cstdio>#include <cstdlib>#include <string.h>#include <iostream>using namespace std;#define N 16000005#define FRE freopen("a.txt","r",stdin)char str[20000000];int hash[N];int cc[200];int main(){    int n,nc;    while(scanf("%d%d",&n,&nc)!=EOF){        int i,j;        scanf("%s",str);        int len = strlen(str);        int cnt =  0;        memset(cc,0,sizeof(cc));        memset(hash,0,sizeof(hash));        int tmp = 1;        for(j=1;j<n;j++)tmp*=nc;        i=0;        while(str[i]){            if(!cc[str[i]]){            cc[str[i]] = ++cnt;            }            i++;            if(cnt==nc)break;        }        int d = 0;        for(i=0;i<n;i++){            d = d*nc + cc[str[i]];        }        hash[d] = 1;        int ans = 1;        for(i=0;i+n<len;i++){            d = nc*(d-tmp*cc[str[i]])+ cc[str[i+n]];            if(!hash[d]){                hash[d] = 1;                ans++;            }        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击