Pagini recente » Cod sursa (job #2830997) | Cod sursa (job #2247005) | Cod sursa (job #1080805) | Cod sursa (job #1278287) | Cod sursa (job #1865615)
#include <cstdio>
#include <cstring>
using namespace std;
FILE *f, *g;
int lst[10500001];
int val[50001];
int urm[50001];
int nr;
int HASH = (1 << 20) - 1;
char anticText[10000010];
char dict[100];
int h(int x)
{
return (x & HASH);
}
void add(int a, int b)
{
int p = lst[a];
while(p != 0)
{
if(val[p] == b)
return;
p = urm[p];
}
val[++ nr] = b;
urm[nr] = lst[a];
lst[a] = nr;
}
bool caut(int a, int b)
{
int p = lst[a];
while(p != 0)
{
if(val[p] == b)
return 1;
p = urm[p];
}
return 0;
}
int n;
void addDict()
{
int i;
int len = strlen(dict) - 1;
int nr = 0;
//printf("*%s", dict);
// printf("%d\n", n);
if(n == 0)
n = len;
if(len != n)
return;
for(i = 0; i < len; i ++)
{
nr = nr * 3 + dict[i] - 'a';
}
//printf("%d\n", nr);
add(h(nr), nr);
}
void readFile()
{
f = fopen("abc2.in", "r");
fgets(anticText, 10000009, f);
while(fgets(dict, 30, f) != 0)
{
addDict();
}
fclose(f);
}
int putere(int a, int b)
{
int rez = 1, ca = a;
int i;
for(i = 0; (1 << i) <= b; i ++)
{
if(((1 << i) & b) != 0)
{
rez *= ca;
}
ca *= ca;
}
return rez;
}
int rez;
void solve()
{
int MODL = putere(3, n - 1);
int i;
int l = strlen(anticText) - 1;
int nr = 0;
for(i = 0; i < l; i ++)
{
if(i < n)
{
nr = nr * 3 + anticText[i] - 'a';
}
else
{
rez += caut(h(nr), nr);
// printf("*%d\n", nr);
nr = nr % MODL;
//printf("%d\n", nr);
nr = nr * 3 + anticText[i] - 'a';
}
}
rez += caut(h(nr), nr);
}
/*
bca = 9 + 6 = 15
15 % 9 = 6
6 * 3 + 2
cac =
*/
void printFile()
{
g = fopen("abc2.out", "w");
fprintf(g, "%d\n", rez);
fclose(g);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}