Cod sursa(job #2910627)

Utilizator test9265test9265 test9265 Data 22 iunie 2022 22:27:40
Problema Potrivirea sirurilor Scor 18
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>
 
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
const int N = 2000005;
char A[N],B[N];
int p[N],nrPotriviri,potriviri[1001];///p=functia prefix
int main()
{
    f>>A+1>>B+1;
    int n=strlen(A+1);
    int m=strlen(B+1);
    /// pasul 1 - calculul functiei prefix
    int q=0;
    for(int i=2;i<=n;i++)
    {
        while(q>0&&A[i]!=A[q+1])q=p[q];
        if(A[i]==A[q+1])q++;
        p[i]=q;
    }
    /// pasul 2 - algoritmul KMP de determinare a potrivirilor
    q=0;
    for(int i=1;i<=m;i++)
    {
        if(q>0&&B[i]!=A[q+1])q=0;
        if(B[i]==A[q+1])q++;
        if(q==n)///am gasit o potrivire
        {
            nrPotriviri++;
            if(nrPotriviri<=1000)
                potriviri[nrPotriviri]=i-n;
        }
    }
 
    ///afisare
    g<<nrPotriviri<<'\n';
    if(nrPotriviri>1000)
        nrPotriviri=1000;
    for(int i=1;i<=nrPotriviri;i++)
        g<<potriviri[i]<<' ';
    return 0;
}