Cod sursa(job #1248755)

Utilizator crisojogcristian ojog crisojog Data 25 octombrie 2014 22:04:04
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <string.h>
#include <algorithm> 
#include <stdlib.h>

#define NMAX 2000005

using namespace std;

void computeLPSArray(char* pat, long M, long* lps) {
    long len = 0, i = 1;
    lps[0] = 0;
    
    while(i < M) {
        if(pat[i] == pat[len]) {
            lps[i++] = ++len;
        } else {
            if(len != 0) {
                len = lps[len - 1];
            } else {
                lps[i++] = 0;
            }
        }
    }
}

void KMPSearch(char* pat, char* txt) {
    long M = strlen(pat);
    long N = strlen(txt);
    long* lps = (long*) malloc(sizeof(long) * M);
    long sol[1000];
    long i, j, k = 0;
    
    computeLPSArray(pat, M, lps);
    
    while(i < N) {
        if(pat[j] == txt[i]) {
            i++; j++;
        }
        if(j == M) {
            if(k < 1000) {
                sol[k] = i - j;
            }
            k++;
            j = lps[j - 1];
        } else if(pat[j] != txt[i]) {
            if(j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }
    
    printf("%ld\n", k);
    
    if(k > 1000) k = 1000;
    
    for(i = 0; i < k; i++) {
        printf("%ld ", sol[i]);
    }
    printf("\n");
    free(lps);
}

int main() {
    freopen("strmatch.in", "r", stdin);
    freopen("strmatch.out", "w", stdout);
    
    char pat[NMAX], txt[NMAX];
    scanf("%s%s", pat, txt);
    
    KMPSearch(pat, txt);
    
    return 0;
}