Cod sursa(job #219155)

Utilizator RobybrasovRobert Hangu Robybrasov Data 5 noiembrie 2008 21:06:57
Problema Prefix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#define N 6000

char s[N],t[N];
int poz[N],n,k,i,j,k2,kont,l,kkont;

void prefix(int m)
{
    int i,k=0;
    for (i=2; i<=m; i++)
    {
        while (k && t[k+1]!=t[i]) k=poz[k];
        if (t[k+1]==t[i]) k++;
        poz[i]=k;
    }
}

void kmp(int m, int a, int b)
{
    int i,k=0;
    prefix(m);
    for (i=a; i<=b; i++)
    {
        while (k && t[k+1]!=s[i]) k=poz[k];
        if (t[k+1]==s[i]) k++;
        if (k==m)
        {
            //printf("%d ",i-m);
            if ((i-m)%k==0) kkont++;
            k=poz[k];
        }
    }
}

int main()
{
    freopen("per.in","r",stdin);
    freopen("per.out","w",stdout);
    scanf("%d %d\n",&n,&k);
    fgets(s+1,N,stdin);
    kkont=0;
    for (i=1; i<=n/k; i++)//toate marimile
        for (j=1; j<=n-k*i+1; j++)//toate pozitiile
        {
            for (l=1; l<=i; l++) t[l]=s[j+l-1];
            kmp(i,j+i,j+(k-1)*i);
        }
    printf("%d",kkont);

    return 0;
}