Cod sursa(job #2023585)

Utilizator MaligMamaliga cu smantana Malig Data 19 septembrie 2017 09:47:30
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <deque>
#include <ctime>
#include <queue>
#include <cstring>

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
using zint = int;
using namespace std;
const int inf = 3e4 + 5;
const int NMax = 2e6 + 5;
ifstream in("strmatch.in");
ofstream out("strmatch.out");

int N,M;
char str[NMax],patt[NMax];
int pf[NMax],sol[NMax];

int main() {
    in>>(patt+1)>>(str+1);
    N = strlen(patt+1);
    M = strlen(str+1);
    int k;

    k = 0;
    for (int i=2;i <= N;++i) {
        while (patt[i] != patt[k+1] && k > 0) {
            k = pf[k];
        }

        if (patt[i] == patt[k+1]) {
            ++k;
        }

        pf[i] = k;
    }

    k = 0;
    for (int i=1;i <= M;++i) {
        while (str[i] != patt[k+1] && k > 0) {
            k = pf[k];
        }

        if (str[i] == patt[k+1]) {
            ++k;
            if (k == N) {
                sol[++sol[0]] = i-N;
                k = pf[k];
            }
        }
    }

    out<<sol[0]<<'\n';
    sol[0] = (1000 < sol[0]) ? 1000 : sol[0];
    for (int i=1;i <= sol[0];++i) {
        out<<sol[i]<<' ';
    }

    in.close();out.close();
    return 0;
}