Pagini recente » Cod sursa (job #16448) | Cod sursa (job #1846163) | Cod sursa (job #3152914) | Cod sursa (job #876089) | Cod sursa (job #1238440)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#define lim 2000005
using namespace std;
int pattern_len,string_len;
int b[lim];
FILE *fi,*fo;
void kmp_preprocess(char pattern[]){
int i = 0,j=-1;
b[0] =-1;
while(i < pattern_len){
while(j >= 0 && pattern[i] != pattern[j]) j = b[j];
++i;
++j;
b[i] = j;
}
for(int i = 0; i <= pattern_len; i++){
printf("%d ",b[i]);
}
}
void kmp_search(char pattern[],char string[]){
int i = 0;
int j = 0;
int cnt =0;
int sol[1005];
while ( i < string_len){
while(j >=0 && string[i] != pattern[j]) j = b[j];
++i;
++j;
if(j == pattern_len){
if(cnt < 1001)
sol[cnt] = i - j;
cnt++;
j = b[j];
}
}
fprintf(fo,"%d\n",cnt);
for(int i = 0; i < cnt; i++){
if( i == 1000)
break;
fprintf(fo,"%d ",sol[i]);
}
}
int main(){
char pattern[lim],string[lim];
fi = fopen("strmatch.in","r");
fo = fopen("strmatch.out","w");
fscanf(fi,"%s\n%s",pattern,string);
fclose(fi);
pattern_len = strlen(pattern) -1;
string_len = strlen(string) -1;
kmp_preprocess(pattern);
kmp_search(pattern,string);
return 0;
}