Pagini recente » Cod sursa (job #1118873) | Cod sursa (job #612564) | Cod sursa (job #1536859) | Cod sursa (job #2438980) | Cod sursa (job #1971302)
#include <stdint.h>
#include <fstream>
#include <string.h>
#define nmax 10000001
#define mmax 21
#define mod 666013
using namespace std;
fstream f1("abc2.in", ios::in);
fstream f2("abc2.out", ios::out);
char sir[nmax], cuv[mmax];
uint32_t n, nrt, rez;
int16_t m;
const int16_t d=3;
uint32_t ct;///=d^(m-1)
struct nod
{
uint32_t val;
nod * urm;
} *t[mod+2];
uint32_t hash_c()
{
int16_t i;
uint32_t h=0;
for(i=0; i<m; i++)
{
h=h*d+(cuv[i]-'a');
}
return h;
}
uint32_t hash_s()
{
int16_t i;
uint32_t h=0;
for(i=0; i<m; i++)
{
h=h*d+(sir[i]-'a');
}
return h;
}
void putere()
{
int16_t i;
ct=1;
for(i=1; i<m; i++)
ct*=d;
ct%=mod;
}
void adauga(uint32_t numar)
{
nod *p= new nod;
p->val=numar;
p->urm = t[numar%mod];
t[numar%mod]=p;
}
int16_t gaseste(uint32_t numar)
{
nod*p;
for(p=t[numar%mod]; p!=0; p=p->urm)
if(p->val==numar) return 1;
return 0;
}
int main()
{
uint32_t numar, i;
f1>>sir; n=strlen(sir);
f1>>cuv; m=strlen(cuv);
do
{
numar=hash_c();
adauga(numar);///adaugi numar la lista t[numar%mod]
}while(f1>>cuv);
numar=hash_s();
if(gaseste(numar)) rez++; ///daca gasesti numar la lista t[numar%mod]
putere();///calc ct, care te ajuta sa faci trecerea intre secv textului lung
for(i=1; i<=n-m; i++)
{
///treci la urmatoarea secv modificand hashul pt val
numar= numar- ct*(sir[i-1]-'a');
numar= (numar*d+ sir[i+m-1]-'a');
if(gaseste(numar)) rez++; ///daca gasesti numar la lista t[numar%mod]
}
f2<<rez;
return 0;
}