Cod sursa(job #531300)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 9 februarie 2011 13:20:04
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <math.h>
#define N 2000005

using namespace std;
char A[N],B[N];
int sir[1005];
int pi[N];
int n;
void computePI() {
    int lung = strlen(A);
    int k = 0;
    for(int i = 1; i <= lung; i++) {
        while (k != 0 && A[k] != A[i])
         k = pi[k - 1];
        if (A[k] == A[i])
         k++;
        pi[i] = k;
    }
}
int min(int a,int b) {
    if (a > b) return b;
    return a;
}
void kmp() {
    int lung = strlen(B);
    int n = strlen(A);
    int k = 0;
    for(int i = 0; i < lung; i++) {
        while (k > 0 && A[k] != B[i])
         k = pi[k-1];
        if (A[k] == B[i]) k++;
        if (k == n) {
            sir[0]++;
            if (sir[0] <= 1000)
             sir[++sir[0]] = i - k + 1;
            k = pi[k - 1];
        }
    }
}
int main() {
    freopen("strmatch.in","r",stdin);
    freopen("strmatch.out","w",stdout);
    scanf("%s",&A);
    scanf("%s",&B);
    for(int i = 1; i <= sir[0]; i++)
     printf("%d",sir[i]);
    computePI();
    kmp();
    printf("%d\n",sir[0]);
    for(int i = 1; i <= min(sir[0],1000); i++)
     printf("%d ",sir[i]);

    return 0;
}