Cod sursa(job #1487556)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 16 septembrie 2015 23:50:02
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MOD1 666013
#define MOD2 100000
using namespace std;
int lungime,lim,n;
long long b[10000004],c[50005];
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;
    for(int i=0;i<lungime;i++)
    {
        h1+=nr2*(ch1[i]-'a');
        nr2/=3;
    }
    ++n;
    b[n]=h1;
    for(int i=lungime;i<lim;i++)
    {
        h1-=((nr1*(ch1[i-lungime]-'a')));
        h1*=3;
        h1+=ch1[i]-'a';
        ++n;
        b[n]=h1;
    }
    sort(b+1,b+n+1);
    int ct=0,m=0;
    while(1)
    {
        nr2=nr1;
        h1=0;
        for(int i=0;i<lungime;i++)
        {
            h1+=nr2*(ch2[i]-'a');
            nr2/=3;
        }
        c[++m]=h1;
        /*int s=1,e=n;
        while(s<=e)
        {
            int mij=(s+e)/2;
            if(b[mij]==h1)
            {
                ct++;
                s=mij+1;
            }
            else if(b[mij]<h1) s=mij+1;
            else e=mij-1;
        }*/
        if(feof(stdin)) break;
        scanf("%s",ch2);
    }
    sort(c+1,c+m+1);
    for(int i=1;i<=m;i++)
    {
        if(c[i]!=c[i-1])
        {
            int s=1,e=n;
            while(s<=e)
            {
                int mij=(s+e)/2;
                if(b[mij]==c[i])
                {
                    ct++;
                    s=mij+1;
                }
                else if(b[mij]<c[i]) s=mij+1;
                else e=mij-1;
            }
        }
    }
    printf("%d\n",ct);
}