Pagini recente » Cod sursa (job #3285043) | Cod sursa (job #1984587) | Cod sursa (job #2321994) | Cod sursa (job #2592527) | Cod sursa (job #2289861)
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream f("abc2.in");
ofstream g("abc2.out");
const unsigned int MaxN=10111000;
const unsigned int MaxL=50;
const unsigned int MaxK=66111;
char str[MaxN],cuv[MaxL];
unsigned int N,L,sol,cpow,cod,C[MaxK],K,tstep,F[MaxL];
inline unsigned int get(unsigned int key)
{
int first=0;
int M=tstep;
while(M>0)
{
unsigned int index=first+F[M];
if(index>K || key<C[index])
{
--M;
}
else if(key==C[index])
{
return true;
}
else
{
M-=2;
first=index;
}
}
return false;
}
int main()
{
f.getline(str,sizeof(str));
N=strlen(str);
K=0;
while(f.getline(cuv,sizeof(cuv)))
{
if(L==0)
{
L=strlen(cuv);
}
cod=0;
for(register unsigned int i=0;i<L;++i)
{
cod*=3;
cod+=cuv[i]-'a';
cuv[i]=0;
}
C[++K]=cod;
}
f.close();
sort(C+1,C+1+K);
F[1]=1;
unsigned int i;
for(i=2;F[i-1]<K;++i)
{
F[i]=F[i-1]+F[i-2];
}
tstep=i-1;
cpow=1;
for(register unsigned int i=1;i<L;++i)
{
cpow*=3;
}
cod=0;
for(register unsigned int i=0;i<L;++i)
{
str[i]-='a';
cod*=3;
cod+=str[i];
}
sol+=get(cod);
for(register unsigned int i=L;i<N;++i)
{
str[i]-='a';
cod-=cpow*str[i-L];
cod*=3;
cod+=str[i];
sol+=get(cod);
}
g<<sol;
return 0;
}