Pagini recente » Cod sursa (job #1729502) | Cod sursa (job #1288336) | Cod sursa (job #1730064) | Cod sursa (job #516514) | Cod sursa (job #1037008)
#include <iostream>
#include<stdio.h>
#include <string.h>
using namespace std;
int poz[2000001],po=0;
void preKmp( char* pattern , int pattern_length, int kmpNext[] )
{
int i , j;
i = 0;
j = -1;
kmpNext[ 0 ] = -1;
while ( i < pattern_length )
{
while ( j > -1 && pattern[ i ] != pattern[ j ] )
j = kmpNext[ j ];
i++;
j++;
if ( pattern[ i ] == pattern[ j ] )
kmpNext[ i ] = kmpNext[ j ];
else
kmpNext[ i ] = j;
}
}
void knuth_morris_pratt( char* pattern , int pattern_length , char* source , int source_length )
{
int i , j;
int kmpNext[ 20000 ];
preKmp( pattern , pattern_length , kmpNext );
i = 0;
j = 0;
while ( j < source_length )
{
while ( i > -1 && pattern[ i ] != source[ j ] )
i = kmpNext[ i ];
i++;
j++;
if ( i >= pattern_length )
{
poz[po]= j - i;
po++;
i = kmpNext[ i ];
}
}
}
void readFile(char *code1,char *code2)
{
FILE *file;
int i = 0;
file = fopen("strmatch.in", "r");
do
{
code1[i++] = (char)fgetc(file);
} while(code1[i-1] != '\n');
code1[i-1] = '\0';
i=0;
do
{
code2[i++] = (char)fgetc(file);
} while(code2[i-1] != '\n');
code2[i-1] = '\0';
}
int main()
{
char a[2000001],b[2000001];
freopen("strmatch.out","w",stdout);
readFile(a,b);
knuth_morris_pratt(a ,strlen(a) , b ,strlen(b));
cout<<po<<endl;
if(po>1000)
po=1000;
for(int i=0;i<po;i++)
cout<<poz[i]<<" ";
return 0;
}