Pagini recente » Cod sursa (job #108734) | Cod sursa (job #2127768) | Cod sursa (job #1234632) | Cod sursa (job #1155733) | Cod sursa (job #2582056)
#include <iostream>
#include<fstream>
#include<cstring>
#define mod 666013
#define N 10000005
using namespace std;
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
char s[N];
int ct;
int n; //lg cuv din dictionar
int p3[25];
struct nod
{
int info;
nod *urm;
};
nod *g[mod+1];
bool gasit(int val)
{
int lista = val % mod;
nod *p;
for(p = g[lista]; p; p = p->urm)
if(p -> info == val)return 1;
return 0;
}
void add(int x)
{
int lista = x % mod;
nod *p = new nod;
p -> info = x;
p -> urm = g[lista];
g[lista] = p;
}
int main()
{
char cuv[25];
int i, val, sol=0, l;
fin >> s;
l=strlen(s);
int putere=1;
///vectorul cu puteri
p3[0] = 1;
for(i = 1; i <= 20; ++i)
p3[i] = p3[i-1]*3;
while(fin >> cuv)
{
//transf in baza 3 ,putem si invers
n=strlen(cuv);
val = 0;
for(i = n-1; i >= 0;--i)
val += p3[n-i-1] * (cuv[i] - 'a');
//if(!gasit(val))
add(val);
//cout << val <<" ";
}
for (i =1; i < n; ++i)
putere *= 10;
//transf primele n caractere in nr
val = 0;
for(i=0; i < n; ++i)
val += (s[i]-'a') *p3[n-1-i];
if(gasit(val))sol++;
//cout << "\n" << val <<"\n";
cout << sol << " ";
for(i = n; i<l ;++i)
{
//eliminam caracterul i-n,adaugam caracterul i
// toate puterile trebuie sa scada cu 3
val /= 3;
val %= putere;//elimin prima
val += (s[i]-'a') *p3[n-1];
if(gasit(val))sol++;
cout << sol << " ";
}
fout << sol;
return 0;
}