Pagini recente » Cod sursa (job #1435109) | Cod sursa (job #1069252) | Cod sursa (job #2941083) | Cod sursa (job #2151663) | Cod sursa (job #205994)
Cod sursa(job #205994)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 2000001
#define min(a,b) (a) < (b) ? (a) : (b)
char T[NMAX],P[NMAX];
int offset[NMAX],nmch;
bool match[NMAX];
void citire()
{
FILE * fin = fopen("strmatch.in","r");
fgets(P,NMAX + 1,fin);
if (P[strlen(P) - 1] == '\n') P[strlen(P) - 1] = '\0'; //o da
fgets(T,NMAX + 1,fin);
}
void afis()
{
FILE * fout = fopen("strmatch.out","w");
fprintf(fout,"%d\n",nmch);
nmch = min(nmch,1000);
for(int i = 0, j = 0; i < NMAX & j < nmch ; ++i )
if(match[i])
fprintf(fout,"%d ",i), ++j ;
}
void kmp() //knuth morris pratt O(N+M)
{
int N = strlen(T),M = strlen(P);
for(int i = 1, k = 0; i < M; ++i)
{
while( k > 0 & P[k] != P[i])
k = offset[k - 1];
if(P[i] == P[k]) ++k;
offset[i] = k;
}
for(int j = 0,i = 0; i < N ; ++i)
{
while(j > 0 & T[i] != P[j]) j = offset[j - 1]; // aici DEJA STIE toate lungimile
if(T[i] == P[j]) ++j; // dar compara pe T[i] cu fiecare sufix
if(j==M)
{
match[i - M + 1] = 1 , ++nmch, j = offset[j];
} //aici NU se pune break in KMP !!!!!!!!!
}
}
int main()
{
citire();
kmp();
afis();
}