Cod sursa(job #65315)

Utilizator DastasIonescu Vlad Dastas Data 8 iunie 2007 13:43:59
Problema Lista lui Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>

FILE *in = fopen("panouri.in","r"), *out = fopen("panouri.out","w");

int a[200000];
int b[20000];
int t[20001];
int fr[20001];

int n, m;

void read()
{
    fscanf(in, "%d %d", &n, &m);

    for ( int i = 0; i < n; ++i )
        fscanf(in, "%d", &a[i]);
    for ( int i = 0; i < m; ++i )
    {
        fscanf(in, "%d", &b[i]);
        t[b[i]] = 1;
    }
}

int main()
{
    read();
    for ( int i = 0; i < n; ++i )
        printf("%d ", a[i]);
    printf("\n");
    for ( int i = 0; i < m; ++i )
        printf("%d ", b[i]);
    printf("\n");
    int p = 0, u = 0, min = 1000000000;

    int cnt = 0; // cate elemente din a[p..u] apartin multimii b
    while ( p <= u && u < n )
    {
        if ( t[a[u]] == 1 && fr[a[u]] == 0 )
            ++cnt, ++fr[a[u]];
        if ( cnt == m )
        {
            --fr[a[p]];
            ++p, --cnt;
            if ( u-p+1 < min )
                min = u-p;
            while ( !t[a[p]] )
                ++p;

        }
        ++u;
    }
    fprintf(stdout, "%d\n", min);

	return 0;
}

//1 2 3 5 3 1
//5 1