Cod sursa(job #3334350)

Utilizator MariaStetiuMaria Stetiu MariaStetiu Data 17 ianuarie 2026 11:21:15
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>

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

#define maxn 2000001

char pattern[maxn], text[maxn];
int pref[maxn], n, m, maxSolNr;
vector <int> sol;


///construim sirul de prefize pt pattern
void compute_prefix_table()
{
    //pref[1]=0;
    int k;
    for(int i=2; i<=n; i++){
        k=pref[k-1];
        while(k && pattern[i]!=pattern[k+1])
            k=pref[k];
        if(pattern[i]==pattern[k+1])
            k++;
        pref[i]=k;
    }
}

int main()
{
    int j;//pattern position

    fin>>pattern+1>>text+1;

    n=strlen(pattern+1);
    m=strlen(text+1);

    compute_prefix_table();

    for(int i=1; i<=m; i++){
        while(j && text[i]!=pattern[j+1]){
            j=pref[j];
        }
        if(text[i]==pattern[j+1])
            j++;
        if(j==n){//daca am ajuns cu j la finalul pattern ului adica l am gasit o data in text
            sol.push_back(i-n+1);//valoarea de inceput a acestui matching
        }
    }

    fout<<sol.size()<<endl;
    maxSolNr=0;
    for(auto it:sol){
        fout<<it-1<<' ';
        if(++maxSolNr == 1000)
            break;
    }

    return 0;
}