Pagini recente » Cod sursa (job #516619) | Cod sursa (job #453059) | Cod sursa (job #808148) | Cod sursa (job #656461) | Cod sursa (job #1488024)
#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);
}