Cod sursa(job #1238440)

Utilizator xoSauceSergiu Ferentz xoSauce Data 6 octombrie 2014 22:47:14
Problema Potrivirea sirurilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#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;
}