Pagini recente » Monitorul de evaluare | Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #530473)
Cod sursa(job #530473)
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
const int MOD = 3033;
vector<unsigned int> Hash[MOD];
void Add(unsigned int value)
{
int pos = value % MOD;
for (vector<unsigned int>::iterator it = Hash[pos].begin(); it != Hash[pos].end(); ++it)
if (*it == value)
return;
Hash[pos].push_back(value);
}
bool Find(unsigned int value)
{
int pos = value % MOD;
for (vector<unsigned int>::iterator it = Hash[pos].begin(); it != Hash[pos].end(); ++it)
if (*it == value)
return true;
return false;
}
int N, M;
char text[10000002], query[22];
int result;
int main()
{
ifstream fin("abc2.in");
ofstream fout("abc2.out");
fin.getline(text, sizeof(text));
N = strlen(text);
while (fin.getline(query, sizeof(query)))
{
if (!M) M = strlen(query);
unsigned int now = 0;
for (int i = 0; query[i] != '\0'; ++i)
now *= 3, now += query[i] - 'a';
Add(now);
}
long long pow3 = 1;
for (int i = 1; i <= M; ++i)
pow3 *= 3;
long long pnow = 0;
for (int i = 0; i < M; ++i)
pnow *= 3, pnow += text[i] - 'a';
result += Find(pnow);
for (int i = M; i < N; ++i)
{
pnow *= 3, pnow %= pow3, pnow += text[i] - 'a';
result += Find(pnow);
}
fout << result;
fin.close();
fout.close();
}