Pagini recente » Cod sursa (job #3174825) | Cod sursa (job #147293) | Cod sursa (job #18105) | Cod sursa (job #1346230) | Cod sursa (job #219155)
Cod sursa(job #219155)
#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;
}