Pagini recente » Cod sursa (job #781513) | Cod sursa (job #2500184) | Cod sursa (job #2938442) | Cod sursa (job #2302732) | Cod sursa (job #1502135)
#include <fstream>
#include <string.h>
#include <algorithm>
#include <set>
#define dim 10000010
using namespace std;
ifstream fin("abc2.in");
ofstream fout("abc2.out");
int i,j,n,m,val,sol,nr,power,cod[dim];
char s[dim],c[22];
bool viz[dim];
set <int> cuv;
int binsrch(int x)
{
int st=0,dr=n-m,mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(x<=cod[mij])
dr=mij-1;
else
if(x>cod[mij])
st=mij+1;;
}
mij=(st+dr)/2;
return mij;
}
int main()
{
std::set<int>::iterator it;
fin>>(s+1);
fin>>(c+1);
n=strlen(s+1);
m=strlen(c+1);
power=1;
for(i=1;i<=m;i++)
{
nr=nr*3+s[i]-'a';
val=val*3+c[i]-'a';
power*=3;
}
power/=3;
cuv.insert(val);
for(i=m+1;i<=n;i++)
{
cod[i-m]=nr;
nr=(nr-power*(s[i-m]-'a'))*3+s[i]-'a';
}
sort(cod+1,cod+n-m+1);
while(fin>>(c+1))
{
val=0;
for(i=1;i<=m;i++)
{
val=val*3+c[i]-'a';
}
cuv.insert(val);
}
for( it=cuv.begin();it!=cuv.end();it++)
{
i=binsrch(*it);
i++;
while(cod[i]==*it)
{
sol++;
i++;
}
}
fout<<sol;
return 0;
}