首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Codeforces Round #166 (Div. 二) D - Good Substrings

2013-02-19 
CodeforcesRound #166 (Div. 2)D - Good Substrings题意说的很清楚了,就是要寻找满足某一条件的不同字串个

Codeforces Round #166 (Div. 2) D - Good Substrings

题意说的很清楚了,就是要寻找满足某一条件的不同字串个数。

方法一:

寻找不同字串个数体型很直接的一种方法就是把字符串hash值保存在set或者数组中,统计其中不同的个数。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAXN 2010char r[MAXN];int sa[MAXN];int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];int height[MAXN],rank[MAXN];int sum[2000],k;inline bool cmp(int *r,int a,int b,int len){    return r[a]==r[b]&&r[a+len]==r[b+len];}void SA(int n,int m){    int i,j,p,*x=wa,*y=wb,*t;    for(i=0;i<m;i++)        ws[i]=0;    for(i=0;i<n;i++)        ws[x[i]=r[i]]++;    for(i=1;i<m;i++)        ws[i]+=ws[i-1];    for(i=n-1;i>=0;i--)        sa[--ws[x[i]]]=i;    for(j=p=1;p<n;j<<=1,m=p){        for(p=0,i=n-j;i<n;i++)            y[p++]=i;        for(i=0;i<n;i++){            if(sa[i]>=j)                y[p++]=sa[i]-j;        }        for(i=0;i<m;i++)            ws[i]=0;        for(i=0;i<n;i++)            ws[wv[i]=x[y[i]]]++;        for(i=1;i<m;i++)            ws[i]+=ws[i-1];        for(i=n-1;i>=0;i--)            sa[--ws[wv[i]]]=y[i];        for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)            x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;    }}void Height(int n){    int i,j,k=0;    for(i=1;i<=n;i++)        rank[sa[i]]=i;    for(i=0;i<n;height[rank[i++]]=k)        for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);}void solve(int n){    int i,j;    int ans=0;    for(i=1;i<=n;i++){        for(j=sa[i]+height[i];j<n;j++){            if(sum[j+1]-sum[sa[i]]>k)break;            ans++;        }    }    printf("%d\n",ans);}int main(){    int i,j,n;    char str[50];    memset(sum,0,sizeof(sum));    scanf("%s",r);    scanf("%s",str);    scanf("%d",&k);    n=strlen(r);    for(i=1;i<=n;i++){        sum[i]=sum[i-1]+(str[r[i-1]-'a']=='0');    }    memset(height,0,sizeof(height));    SA(n+1,130);    Height(n);    solve(n);}



热点排行