Cod sursa(job #1488024)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 17 septembrie 2015 19:39:44
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <cstring>
#define MOD1 1299299
#define MOD2 1249643
int lungime,lim;
int b[MOD1],c[MOD2],d[MOD1],e[MOD2];
char ch1[10000004],ch2[50023];
int minim(int a,int b)
{
    if(a<b) return a;
    return b;
}
int main()
{
    freopen ("abc2.in","r",stdin);
    freopen ("abc2.out","w",stdout);
    scanf("%s",ch1);
    scanf("%s",ch2);
    lungime=strlen(ch2);
    lim=strlen(ch1);
    long long nr2=0,nr1=1;
    for(int i=1;i<lungime;i++) nr1*=3;
   // printf("%lld\n",nr1);
    nr2=nr1;
    long long h1=0,h2=0;
    for(int i=0;i<lungime;i++)
    {
        h1+=nr2*(ch1[i]-'a');
        h2+=nr2*(ch1[i]-'a');
        h1%=MOD1;
        h2%=MOD2;
        nr2/=3;
    }
    b[h1]++;
    c[h2]++;
   // printf("%lld %lld\n",h1,h2);
    for(int i=lungime;i<lim;i++)
    {
        h1-=((nr1*(ch1[i-lungime]-'a')));
        while(h1<0) h1+=MOD1;
        h1*=3;
        h1+=(ch1[i]-'a');
        h1%=MOD1;
        h2-=((nr1*(ch1[i-lungime]-'a')));
        while(h2<0) h2+=MOD2;
        h2*=3;
        h2+=(ch1[i]-'a');
        h2%=MOD2;
        b[h1]++;
        c[h2]++;
      //  printf("%lld %lld\n",h1,h2);
    }
   // printf("\n\n");
    int ct=0;
    while(1)
    {
        nr2=nr1;
        h1=0,h2=0;
        for(int i=0;i<lungime;i++)
        {
            h1+=nr2*(ch2[i]-'a');
            h2+=nr2*(ch2[i]-'a');
            h1%=MOD1;
            h2%=MOD2;
            nr2/=3;
        }
        //printf("%lld %lld\n",h1,h2);
        if(d[h1]==0||e[h2]==0) if(b[h1]!=0&&c[h2]!=0)
        {
            ct+=minim(b[h1],c[h2]);
            d[h1]=1;
            e[h2]=1;
        }
        if(feof(stdin)) break;
        scanf("%s",ch2);
    }
    printf("%d\n",ct);
}