Pagini recente » Cod sursa (job #1747505) | Cod sursa (job #1579159) | Cod sursa (job #2542063) | Cod sursa (job #1386613) | Cod sursa (job #470703)
Cod sursa(job #470703)
#include<fstream>
#include<vector>
#include<math.h>
#define dmax 10000004
#define dmax2 50004
#define md 666013
#define bz 3
using namespace std;
ifstream in("abc2.in");
ofstream out("abc2.out");
char l[dmax],cuv[dmax2][23];
int nr=-1,m;
long long sol;
vector<int>g[md];
vector<int>::iterator it;
void geth(int k)
{ long long nr=0,n,i,ok=1;
n=strlen(cuv[k]);
for(i=0;i<n;i++)
{ nr+=( (int)pow(bz,n-i-1) * (cuv[k][i]-'a') % md );
if(nr >= md)
nr%=md;
}
for(it=g[nr].begin();it<g[nr].end();it++)
if(!strcmp(cuv[k],cuv[*it]))
ok=0;
if(ok)
g[nr].push_back(k);
}
void comp(long long p1,int k)
{ int i,ok=1;
for(i=0;i<m;i++)
if(l[p1+i] != cuv[k][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;
}
if(!g[h].empty() )
for(it=g[h].begin();it<g[h].end();it++)
comp(0,*it);
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;
if(!g[h].empty() )
for(it=g[h].begin();it<g[h].end();it++)
comp(i,*it);
}
}
int main()
{ int i;
in.getline(l,dmax,'\n');
while(!in.eof() )
{ nr++;
in.getline(cuv[nr],23,'\n');
geth(nr);
}
in.close();
m=strlen(cuv[0]);
search();
out<<sol;
out.close();
return 0;
}