Pagini recente » Cod sursa (job #491889) | Cod sursa (job #396735) | Cod sursa (job #2363751) | Cod sursa (job #657252) | Cod sursa (job #470384)
Cod sursa(job #470384)
#include<fstream>
#include<vector>
#include<algorithm>
#include<math.h>
#define dmax 10000004
#define dmax2 50004
#define md 150151
#define bz 3
using namespace std;
ifstream in("abc2.in");
ofstream out("abc2.out");
char l[dmax];
int nr=-1,m;
long long sol;
struct c
{ char t[23];
int hsh;
} cuv[dmax2];
typedef int (*compfn)(const void *, const void *);
int sf(struct c *a, struct c *b)
{ return a->hsh - b->hsh;
}
void geth(int k)
{ long long nr=0,n,i;
n=strlen(cuv[k].t);
for(i=0;i<n;i++)
{ nr+=( (int)pow(bz,n-i-1) * (cuv[k].t[i]-'a') % md );
if(nr >= md)
nr%=md;
}
cuv[k].hsh=nr;
//out<<cuv[k].hsh<<'\n';
}
int bs(int v)
{ int l,r,m;
l=0;
r=nr+1;
while(l <= r)
{ m=(l+r)/2;
if(cuv[m].hsh == v)
return m;
else if(cuv[m].hsh < v)
l=m+1;
else if(cuv[m].hsh > v)
r=m-1;
}
return -1;
}
void comp(long long p1,int k)
{ int i,ok=1;
for(i=0;i<m;i++)
if(l[p1+i] != cuv[k].t[i])
ok=0;
if(ok)
{ sol++;
//out<<"*"<<p1<<" "<<k<<" "<<"*\n";
}
}
void search()
{ int p,r;
long long i,lng,h=0,f;
f=(long long)pow(bz,m-1) % md;
for(i=0;i<m;i++)
{ h=(bz*h + (l[i]-'a') ) %md;
if(h > md)
h%=md;
}
p=bs(h);
r=p+1;
while(cuv[p].hsh == h && p!=-1)
{ comp(0,p);
p--;
}
while(cuv[r].hsh == h && r!=-1)
{ comp(0,r);
r++;
}
lng=strlen(l);
for(i=1;i <= lng-m ;i++)
{ h= (h + bz*md - f * (l[i-1]-'a'))%md ;
h= (h*bz + ( l[i+m-1]-'a' ) )%md;
if(h < 0)
h+=md;
if(h > md)
h%=md;
p=bs(h);
r=p+1;
while(cuv[p].hsh == h && p!=-1)
{ comp(i,p);
p--;
}
while(cuv[r].hsh == h && r!=0)
{ comp(i,r);
r++;
}
}
}
int main()
{ int i;
in>>l;
while(!in.eof() )
{ nr++;
in>>cuv[nr].t;
geth(nr);
}
in.close();
qsort( (void*)&cuv , nr+1 , sizeof(struct c), (compfn)sf );
/*for(i=0;i<=nr;i++)
out<<cuv[i].t<<" "<<cuv[i].hsh<<'\n';
out<<'\n';*/
m=strlen(cuv[0].t);
search();
out<<sol;
out.close();
return 0;
}