Cod sursa(job #101693)

Utilizator andrei_infoMirestean Andrei andrei_info Data 13 noiembrie 2007 19:01:52
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.67 kb
#include <cstdio>
#include <cstdlib>
#define NR 3500000
#include <vector>

using namespace std;

char T[10000000], P[25];
int rez, N, M;

vector <int> V[NR];

inline int ok( int poz )
{
    for (int i =0 ;i <M;i++)
        if (T[i+poz] != P[i])
            return 0;
    return 1;
};

int main()
{
    freopen("abc2.in", "r", stdin);
    freopen("abc2.out", "w", stdout);
    gets(T);
    gets(P);
    //scanf("%s\n", &T);
    //scanf("%s\n", &P);
    N = strlen(T);
    M = strlen(P);
    int p=0,t=0;

    for (int i=0; i<M; i++)
     {
          p = ( 2*p + P[i]-'a'+1);
          t = ( 2*t + T[i]-'a'+1);
     }

     V[t].push_back(0);
     for (int i=0; i<N-M; i++)
     {
           //t = (d*(t - ((tonum(T[i])*h) % q)) + tonum(T[i+m])) % q;
           t = 2*(t - (T[i]-'a'+1)*(1<<(M-1)) ) + T[i+M]-'a'+1;
           if  ( t<0) exit(1);
           V[t].push_back(i+1);
     }

     //rez += V[p].size();
     for (vector <int > :: iterator it = V[p].begin(); it!= V[p].end(); it++)
            if ( *it >= 0 && ok(*it) )
            {
                rez++;
                *it = -1;
            };
     for( gets(P); !feof(stdin); gets(P) )
     {
         p=0;
         for (int i=0; i<M; i++)
               p = ( 2*p + P[i]-'a'+1);
         //rez+=V[p].size();
         if ( p < 0 ) exit(1);
         for (vector <int > :: iterator it = V[p].begin(); it!= V[p].end(); it++)
            if ( *it >= 0 && ok(*it) )
            {
                rez++;
                *it = -1;
            };
         //V[p].clear();
     };

     printf("%d", rez);
     fclose(stdin);
     fclose(stdout);

     return 0;
};