Cod sursa(job #2802567)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 18 noiembrie 2021 13:09:13
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
#define nmax 2000001

using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");

int kmp[nmax],pa[nmax];
string a,b;


int main()
{
    f>>b>>a;
    cout<<"here"<<a<<' '<<b<<'\n';
    
    kmp[0]=-1; // nu avem nimic inainte
    for(int i=1;i<b.size();i++)
    {
        int x=kmp[i-1];
        while(x!=-1&&b[i]!=b[x+1]) x=kmp[x];
        
        if(x==-1)
        {
            if(b[i]==b[0])kmp[i]=0;
            else kmp[i]=-1;
            
        }
        else kmp[i]=x+1;
        
        
        //cout<<kmp[i]<<' ';
    }
    //cout<<'\n';
    pa[0]=(a[0]==b[0]?0:-1);
    vector<int> ans;
    //cout<<pa[0]<<' ';
    for(int i=1;i<a.size();i++)
    {
        int x=pa[i-1];
        while(a[i]!=b[x+1]&&x!=-1) x=kmp[x];
        
        //cout<<x<<',';
        if(x==-1)
        {
            if(a[i]==b[0]) pa[i]=0;
            else pa[i]=-1;
        }
        else
        pa[i]=x+1;
        
        if(pa[i]==b.size()-1) ans.push_back(i+1);
        //cout<<pa[i]<<' ';
    }
    g<<ans.size()<<'\n';
    for(int i=0;i<min((int)ans.size(),1000);i++) g<<ans[i]-b.size()<<' ';
}