Cod sursa(job #2462794)

Utilizator AvramDanielAvram Daniel AvramDaniel Data 27 septembrie 2019 20:14:35
Problema Potrivirea sirurilor Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<bits/stdc++.h>
using namespace std;

char txt[2000010], pat[2000010];
vector<int> v;
int lps[2000010];

int main()
{
    ifstream cin("strmatch.in");
    ofstream cout("strmatch.out");
    cin>>pat;
    cin>>txt;
    int n = strlen(txt);
    int m = strlen(pat);
    int len = 0;
    lps[0] = 0;
    int i =1;

    while (i<m)
    {
        if(pat[i] == pat[len])
        {
            ++len;
            lps[i] = len;
            i++;
        }
        else
        {
            if(!len)
            {
                lps[i] = 0;
                i++;
            }
            else len = lps[len-1];
        }
    }
    int j =0;
    while(i<n)
    {
        if(txt[i] == pat[j])
        {
            i++;
            j++;
            if(j == m) v.push_back(i-j);
        }
        else
            if(i<n)
        {
            if(j)
            {
                j=lps[j-1];
            }
            else i++;
        }
    }

    cout<<v.size()<<'\n';
    int fin = v.size();
    fin = min(fin, 1000);
    for(i =0;i<fin;i++)
        cout<<v[i]<<' ';
    return 0;
}