Pagini recente » Cod sursa (job #1687488) | Cod sursa (job #2334592) | Cod sursa (job #621129) | Cod sursa (job #2733840) | Cod sursa (job #1739514)
/*
Algoritm_potrivire_KMP
m <- lungime(M), n <- lungime(N)
q <- 0
pt i <- 1, m
cat timp (q > 0) si (N[q + 1] != M[i])
q <- pi[q]
daca N[q + 1] = M[i]
q <- q + 1
daca q = n
scrie "potrivire la pozitia " i - n + 1
*/
#include <cstdio>
#include <fstream>
#include <iostream>
#define LMAX 2000002
using namespace std;
char N[LMAX], M[LMAX];
int pi[LMAX];
int pozitii[1001], poz;
FILE *f=fopen("strmatch.in","r");
ofstream fout ("strmatch.out");
int main()
{
int n=0, m=0;
N[0]='0';
char c='\0';
while(!feof(f) && c !='\n')
{
fscanf(f,"%c",&c);
N[++n]=c;
}
N[n]='\0';
M[0]='0';
fscanf(f,"%c",&c);
while(!feof(f) && c !='\n')
{
M[++m]=c;
fscanf(f,"%c",&c);
}
M[++m]=c;
m--;
int k, i;
k=0;
pi[1]=0;
for(i=2; i<=n; i++)
{
while(k>0 && N[k+1]!=N[i])
k=pi[k];
if(N[k+1]==N[i])
k++;
pi[i]=k;
}
int q=0;
for(i=1; i<=m; i++)
{
while(q>0 && N[q+1]!=M[i])
q=pi[q];
if(N[q+1]==M[i])
q++;
if(q==n-1)
{
++poz;
if(poz<=1000)
pozitii[poz]=i-n+1;
}
}
fout<<poz<<'\n';
if(poz>1000)
poz=1000;
for(i=1;i<=poz;i++)
fout<<pozitii[i]<<' ';
fclose(f);
fout.close();
return 0;
}