Cod sursa(job #3129898)

Utilizator RMTomaRican Mihai Toma RMToma Data 16 mai 2023 11:07:28
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
 
using namespace std;
const int nmax = 2e6;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
 int v[nmax+5], x = 0, cnt = 0;

void computeLPS(char* pat, int M, int* lps)
{
    int len = 0;
 
    lps[0] = 0;
 
    int i = 1;
    while (i < M) {
        if (pat[i] == pat[len]) {
            len++;
            lps[i] = len;
            i++;
        }
        else
        {
            if (len != 0) {
                len = lps[len - 1];
            }
            else
            {
                lps[i] = 0;
                i++;
            }
        }
    }
}
 void KMPSearch(char* pat, char* txt)
{
    int M = strlen(pat);
    int N = strlen(txt);
 
    int lps[M];
    computeLPS(pat, M, lps);
    int i = 0;
    int j = 0;
    while ((N - i) >= (M - j)) {
        if (pat[j] == txt[i]) {
            j++;
            i++;
        }
        if (j == M) {
            cnt++;
          v[x] = i-j;
            j = lps[j - 1];
            x++;
        }
        else if (i < N && pat[j] != txt[i]) {
            if (j != 0)
                j = lps[j - 1];
            else
                i = i + 1;
        }
    }
}
int main()
{
char b[nmax+10], a[nmax+10];
in >> a;
in >> b;
    KMPSearch(a, b);
     out << cnt << "\n";
 for(int i=0;i<x;i++){
     out << v[i] << " ";
 }
}