Cod sursa(job #2955110)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 16 decembrie 2022 11:30:40
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
/// Cerinta
/*
Se dau doua siruri A si B formate din litere mici si mari ale alfabetului englez si din cifre. Se cere gasirea tuturor aparitiilor sirului A ca subsecventa a sirului B.

Date de intrare
Fisierul de intrare strmatch.in contine 2 linii cu sirurile A, respectiv B.

Date de iesire
In fisierul de iesire strmatch.out se va afla pe prima linie numarul N de aparitii a sirului A in sirul B. Pe urmatoarea linie se vor afla N numere care reprezinta pozitiile in care sirul A se potriveste peste sirul B, afisate in ordine crescatoare. Pentru a evita fisierele de output foarte mari, in cazul in care N este mai mare decat 1000 se vor afisa doar primele 1000 de pozitii. Sirurile sunt indexate de la 0.

Restrictii
Lungimea sirurilor A si B se afla in intervalul [1, 2 000 000]
*/

/// Rezolvare - KMP
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MOD 1000000007
#define MAX 2000005

using namespace std;

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

int main()
{
    vector < int > raspuns;
    string s1, s2;
    int n, m, i, k, p[MAX+MAX];

    fin >> s1 >> s2, n = s1.size(), m = s2.size();
    if(n > m) fout << 0;
    else
    {
        s1 += '#';
        s1 += s2;

        p[0] = -1;
        for(i = 1; i <= n + m + 1; i++)
        {
            k = p[i-1];
            while(k >= 0 && s1[k] != s1[i-1]) k = p[k];
            p[i] = k + 1;

            if(p[i] == n) raspuns.pb(i - n - n - 1);
        }

        if(raspuns.size() <= 1000)
        {
            fout << raspuns.size() << '\n';
            for(auto it:raspuns) fout << it << ' ';
        }
        else
        {
            fout << raspuns.size() << '\n';
            for(i = 0; i < 1000; i++) fout << raspuns[i] << ' ';
        }
    }

    return 0;
}

/// Exemple
/*
IN:
ABA
CABBCABABAB

OUT:
2
5 7
*/