Pagini recente » Cod sursa (job #372504) | Cod sursa (job #1553208) | Cod sursa (job #1749834) | Cod sursa (job #2217483) | Cod sursa (job #656718)
Cod sursa(job #656718)
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
#define SMAX 10000010
#define CMAX 25
#define PRIM 100003
#define PUTERE 3
char s[SMAX],cuv[CMAX];
int lungs,lungcuv;
vector<int> t[PRIM + 10];
int puteremax=1,pozcandidat;
void memorare()
{
int valoarecuv=0,i;
int ok=0,rest;
for (i=0; i<(int)strlen(cuv); ++i)
valoarecuv = valoarecuv * PUTERE + (cuv[i] - 'a');
rest = valoarecuv % PRIM;
for (i=0; i<(int)t[rest].size(); ++i)
if (t[rest][i] == valoarecuv)
{
ok = 1;
break;
}
if (ok == 0)
t[rest].push_back(valoarecuv);
}
void read()
{
ifstream fin("abc2.in");
fin.get(s, SMAX); fin.get();
lungs = strlen(s);
while ( !fin.eof() )
{
fin.get(cuv, CMAX); fin.get();
memorare();
}
lungcuv = strlen(cuv);
}
void solve()
{
int i,j,valoares=0,rest;
for (i=0; i<lungcuv; ++i)
{
valoares = valoares * PUTERE + (s[i] - 'a');
if (i > 0)
puteremax *= PUTERE;
}
for (i=0; i<=lungs - lungcuv; ++i)
{
if (i != 0)
valoares = (valoares - ((s[i - 1] - 'a') * puteremax)) * PUTERE + (s[i + lungcuv - 1] - 'a');
rest = valoares % PRIM;
for (j=0; j<(int)t[rest].size(); ++j)
if (t[rest][j] == valoares)
{
pozcandidat++;
break;
}
}
}
void write()
{
ofstream fout("abc2.out");
fout<<pozcandidat<<'\n';
fout.close();
}
int main()
{
read();
solve();
write();
return 0;
}