Cod sursa(job #3257654)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 18 noiembrie 2024 19:27:31
Problema Potrivirea sirurilor Scor 16
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#define NMAX 2020//200
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string s,a;
char x,y;
int j, lps[NMAX],cnt,nr;
int main()
{
    fin>>a>>s;
    s="A"+a+s;
int i;
    for( i=a.size(),x=s[i];i<s.size();++i,x=s[i])
    {
        y=s[lps[i-1]+1];
        if(s[i]==s[lps[i-1]+1] && lps[i-1]+1<i)
        {
            lps[i]=lps[i-1]+1;
            if(lps[i]==a.size())
                ++nr;
        }
        else
        {
            j=i-1;
            while(s[lps[j]+1]!=s[i] && lps[j]!=0)
                j=lps[j],y=s[lps[i]+1];

            if(lps[j]==0 && s[1]==s[i] && i>1)
                lps[i]=1;
            if(lps[j]!=0 && s[lps[j]+1]==s[i] && lps[j]+1<i)
                lps[i]=lps[j]+1;
            if(lps[i]==a.size())
                nr++;
        }
    }

    fout<<nr <<'\n';
    nr=min(nr, 1000);
    for(int i=1;i<=s.size() && cnt<=nr;++i)
        {if(lps[i]==a.size())
        {
           fout<<i-2*a.size()<<" ";
            ++cnt;
        }}
//         fout<<lps[i]<<" ";}
//         fout<<'\n';
//         for(int i=a.size();i<s.size();++i)
//            fout<<s[i]<< " ";
    return 0;

}