Cod sursa(job #1488244)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 18 septembrie 2015 11:24:04
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define MOD 666013
using namespace std;
int lungime,lim;
long long put[20];
long long b[MOD][21];
int lun[MOD];
char ch1[10000004],ch2[50023];
int ct=0;
void find(long long a)
{
     int key=a%MOD;
     for(int i=1;i<=lun[key];i++)
     {
             while(b[key][i]==a)
             {
                                ct++;
                                swap(b[key][i],b[key][lun[key]]);
                                lun[key]--;
                                if(i>lun[key]) return;
             }
     }
}
int main()
{
    freopen ("abc2.in","r",stdin);
    freopen ("abc2.out","w",stdout);
    scanf("%s",ch1);
    scanf("%s",ch2);
    lungime=strlen(ch2);
    lim=strlen(ch1);
    put[0]=1;
    for(int i=1;i<20;i++) put[i]=put[i-1]*3;
    long long h1=0;
    for(int i=0;i<lungime;i++)
    {
        h1+=put[lungime-1-i]*(ch1[i]-'a');
    }
    int key=h1%MOD;
    b[key][++lun[key]]=h1;
    for(int i=lungime;i<lim;i++)
    {
        h1-=((put[lungime-1]*(ch1[i-lungime]-'a')));
        h1*=3;
        h1+=(ch1[i]-'a');
        key=h1%MOD;
        b[key][++lun[key]]=h1;
    }
    while(1)
    {
        h1=0;
        for(int i=0;i<lungime;i++)
        {
            h1+=put[lungime-1-i]*(ch2[i]-'a');
        }
        find(h1);
        if(feof(stdin)) break;
        scanf("%s",ch2);
    }
    printf("%d\n",ct);
}