Cod sursa(job #2201726)

Utilizator FlaviusFeteanFetean Flavius FlaviusFetean Data 5 mai 2018 17:48:35
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#include <list>
#include <cstring>

using namespace std;

char A[2000005],B[2000005];int v[1005];
list<int> l; list<int>::iterator it;

int main()
{
    freopen("strmatch.in", "r", stdin);
    freopen("strmatch.out", "w", stdout);
    fgets(A, sizeof(A), stdin);
    fgets(B, sizeof(B), stdin);
    int M, N, i;
    N = strlen(B); B[N] = '\0'; N--;
    M = strlen(A); A[M] = '\0'; M--;

    for(i = 0; i < N; i++)
    {
        for(it = l.begin(); it != l.end();)
        {
            if(*it == M)
            {v[0]++;v[min(v[0],1001)] = i - M; it = l.erase(it); continue;}
            if(B[i] == A[*it])
                (*it)++,it++;
            else it = l.erase(it);
        }
        if(B[i] == A[0])
            l.push_back(1);
    }
    for(it = l.begin(); it != l.end(); it++)
        if(*it == M)v[0]++,
        v[min(v[0],1001)] = i - M;

    printf("%d\n", v[0]);
    for (i = 1; i <= min(v[0],1000); ++i)
        printf("%d ", v[i]);
    printf("\n");

    return 0;
}