Pagini recente » Cod sursa (job #1811441) | Cod sursa (job #41260) | Cod sursa (job #3282934) | Cod sursa (job #1174817) | Cod sursa (job #1368430)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream is ("abc2.in");
ofstream os ("abc2.out");
const int MOD = 55001;
char Main[10000001], C[22];
unsigned int N, Sol, MainSize;
unsigned int P3[21], X;
vector <pair<unsigned int, int>> Hash[MOD];
void Insert(unsigned int value);
int Find(unsigned int value);
int main()
{
is >> Main;
is >> C;
N = strlen(C);
MainSize = strlen(Main);
P3[0] = 1;
for (int i = 1; i <= N; ++i)
P3[i] = P3[i-1] * 3;
for (int i = 0; i < N; ++i)
X += (P3[i]) * (Main[i] - 'a');
Insert(X);
for (int i = N; i < MainSize; ++i)
{
X /= 3;
X += P3[N-1] * (Main[i] - 'a');
Insert(X);
}
X = 0;
for (int i = 0; i < N; ++i)
X += (P3[i]) * (C[i] - 'a');
Sol += Find(X);
while (is >> C)
{
X = 0;
for (int i = 0; i < N; ++i)
X += (P3[i]) * (C[i] - 'a');
Sol += Find(X);
}
os << Sol;
is.close();
os.close();
}
int Find(unsigned int value)
{
unsigned int R = value % MOD;
unsigned int aux;
for (auto it = Hash[R].begin(); it != Hash[R].end(); ++it)
if ( (*it).first == value)
{
aux = (*it).second;
Hash[R].erase(it);
return aux;
}
return 0;
};
void Insert(unsigned int value)
{
unsigned int R = value % MOD;
for (auto& it : Hash[R])
if (it.first == value)
{
it.second++;
return;
}
Hash[R].push_back({value, 1});
};
/*
bbcabbabcba
11201101210
*/