Cod sursa(job #2709357)

Utilizator VladMxPMihaila Vlad VladMxP Data 20 februarie 2021 10:51:53
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char t[40000100];
int z[40000100];

void z_algoritm(int n,int m)
{
    int st=0,dr=0,i,nr=0;
    z[0]=0;
    for(int k=1;k<m;k++)
    {
        if(k>dr)
        {
            st=dr=k;
            while(dr<m&&t[dr]==t[dr-st])
                dr++;
            z[k]=dr-st;
            dr--;
        }
        else
        {
            i=k-st;
            if(k+z[i]<=dr)z[k]=z[i];
            else
            {
                st=k;
                while(dr<m&&t[dr]==t[dr-st])
                    dr++;
                z[k]=dr-st;
                dr--;
            }
        }
        if(z[k]==n)nr++;
    }
    fout<<nr<<'\n';
    int k=0;
    for(int i=1;i<m&&k<1000;i++)
    {
        if(z[i]==n)
        {
            k++;
            fout<<i-n-1<<" ";
        }
    }
}
int main()
{
    fin.getline(t,20000005);
    int n=strlen(t);
    t[n]='$';
    fin.getline(t+n+1,2000005);
    z_algoritm(n,strlen(t));
}