Cod sursa(job #1631539)

Utilizator Mr.RobotElliot Alderson Mr.Robot Data 5 martie 2016 16:51:59
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>

using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");
const int N = 20000005;
char a[20000005], b[20000005];
int v[20000005];
vector<int> x;
int main()
{
    f.getline(a , N);
    f.getline(b , N);


    int n = strlen( a );
    int m = strlen( b );

    for( int i = n; i > 0; i -- )
        a[i] = a[i-1];
    for( int i = m; i > 0; i -- )
        b[i] = b[i-1];
    a[n+1] = b[m+1] = '\0';

    int i, j;
    i = 0;
    v[ 1 ] = 0;

    for( j = 2; j <= n; j ++ )
    {
        while( i > 0 && a[i + 1] != a[j] )
            i = v[i];
        if( a[i + 1] == a[j] )
            i ++;
        v[j] = i ;
    }

    i = 0;

    for( j = 1; j <= m; j ++ )
    {
        while( i > 0 && a[i+1] != b[j] )
            i = v[ i ];
        if( a[i + 1] == b[j] )
            i ++ ;
        if( i == n  )
        {
             x.push_back(j-n);
             i = v[i ];
        }
    }

    int ans;

    if( x.size() > 1000 )
        ans = 1000;
    else
        ans = x.size();

    g<<ans<<'\n';

    for( int i = 0; i < ans; i ++  )
        g<<x[i]<<" ";

    return 0;
}