Pagini recente » Cod sursa (job #3242304) | Cod sursa (job #2760710) | Cod sursa (job #2298338) | Cod sursa (job #1357719) | Cod sursa (job #169463)
Cod sursa(job #169463)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 10000002;
const int maxl = 22;
const int maxc = 50001;
const int mod1 = 1 << 18;
const int mod2 = 1 << 17;
const int pp1 = 73;
const int pp2 = 3;
FILE *in = fopen("abc2.in","r"), *out = fopen("abc2.out","w");
char a[maxn];
int n, m;
char c[maxc][maxl];
char h1[mod1 / 8 + 1];
char h2[mod2 / 8 + 1];
vector<unsigned short> l[mod1];
int p1[maxl];
int p2[maxl];
int pow(int a, int b, int mod)
{
int s = 1;
for ( int i = 1; i <= b; ++i )
s *= a,
s %= mod;
return s;
}
int j = 1;
void getnr()
{
int hash1 = 0, hash2 = 0;
for ( int i = 0; i < n; ++i )
{
hash1 = (hash1 + p1[i] * c[j][i]) & (mod1 - 1);
hash2 = (hash2 + p2[i] * c[j][i]) & (mod2 - 1);
}
// al hash1-lea bit pe 1
h1[ hash1 >> 3 ] |= (1 << (hash1 & 7));
// al hash2-lea bit pe 1
h2[ hash2 >> 3 ] |= (1 << (hash2 & 7));
l[ hash1 ].push_back(j);
}
char t[maxl];
int check(int what, int from, int to)
{
for ( int i = from; i <= to; ++i )
t[i - from] = a[i];
t[to - from + 1] = '\0';
for ( int i = 0, N = l[what].size(); i < N; ++i )
if ( strcmp(c[ l[ what ][i] ], t) == 0 )
return 1;
return 0;
}
int cnt;
int main()
{
fscanf(in, "%s", a);
m = strlen(a);
fscanf(in, "%s", c[1]);
n = strlen(c[1]);
for ( int i = 0; i < n; ++i )
p1[i] = pow(pp1, n - i - 1, mod1),
p2[i] = pow(pp2, n - i - 1, mod2);
getnr();
++j;
while ( fscanf(in, "%s", c[j]) == 1 )
getnr(), ++j;
int hash1 = 0, hash2 = 0;
for ( int i = 0; i < n; ++i )
{
hash1 = (hash1 + p1[i] * a[i]) & (mod1 - 1);
hash2 = (hash2 + p2[i] * a[i]) & (mod2 - 1);
}
if ( ( h1[ hash1 >> 3 ] & (1 << (hash1 & 7)) ) && ( h2[ hash2 >> 3 ] & (1 << (hash2 & 7)) ) )
if ( check(hash1, 0, n - 1) )
++cnt;
int P1 = p1[0], P2 = p2[0];
for ( int i = n; i < m; ++i )
{
hash1 = ((hash1 - ((a[i - n] * P1) & (mod1 - 1)) + mod1) * pp1 + a[i]) & (mod1 - 1);
hash2 = ((hash2 - ((a[i - n] * P2) & (mod2 - 1)) + mod2) * pp2 + a[i]) & (mod2 - 1);
if ( ( h1[ hash1 >> 3 ] & (1 << (hash1 & 7)) ) && ( h2[ hash2 >> 3 ] & (1 << (hash2 & 7)) ) )
if ( check(hash1, i - n + 1, i) )
++cnt;
}
fprintf(out, "%d\n", cnt);
return 0;
}