Cod sursa(job #1875835)

Utilizator MaligMamaliga cu smantana Malig Data 11 februarie 2017 17:17:15
Problema Potrivirea sirurilor Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

const int NMax = 2000000 + 5;

int nrSol;
int T[NMax],pi[NMax],sol[NMax];
char patt[NMax],str[NMax];

int main() {
    in.getline(patt+1,NMax - 2);
    in.getline(str+1,NMax - 2);

    int lenPatt = strlen(patt+1);
    int lenStr = strlen(str+1);

    if (lenPatt>lenStr) {
        out<<0;
        return 0;
    }

    for (int c=2;c<=lenPatt;++c) {
        for (int i=1;i<=lenPatt-c+1;++i) {
            if (patt[c+i-1]!=patt[i]) {
                break;
            }
            T[c+i-1]=max(T[c+i-1],i);
        }
    }
    int m=1;
    int i=0;
    while (m<=lenStr) {
        if (str[m]==patt[i+1]) {
            ++i;
            if (i==lenPatt) {
                sol[++nrSol] = m-lenPatt+1;
                i=T[i];
            }
            ++m;
        }
        else {
            if (i!=0) {
                i=T[i];
            }
            else {
                ++m;
            }
        }
    }

    out<<nrSol<<'\n';
    nrSol = min(nrSol,1000);
    for (int i=1;i<=nrSol;++i) {
        out<<sol[i]-1<<' ';
    }
    in.close();out.close();
    return 0;
}