Pagini recente » Cod sursa (job #2456124) | Cod sursa (job #287089) | Cod sursa (job #1381690) | Cod sursa (job #1694352) | Cod sursa (job #105524)
Cod sursa(job #105524)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char w[10000000], c, s[20];
int x, i, nr, ind, lg, z;
unsigned int sol, r, v[50005], pt[21], cnt;
int cmp(const void*a, const void*b){
unsigned int x = *(unsigned int *)a, y = *(unsigned int*)b;
if (x < y) return -1;
if (x > y) return 1;
return 0;
}
int caut(unsigned int val)
{
unsigned int i, step;
for (step = 1; step < ind; step <<= 1);
for (i = 0; step; step >>= 1)
if (i + step <= ind && v[i + step] <= val)
i += step;
return i;
}
int main()
{
freopen("abc2.in", "rt", stdin);
freopen("abc2.out", "wt", stdout);
fgets(w, 10000005, stdin);
pt[0] = 1;
for (i=1; i<=20; i++)
pt[i] = 3*pt[i-1];
ind = 0;
x = scanf("%s", s);
while (x != EOF){
nr = strlen(s)-1;
r = 0;
for (i=0; i<=nr; i++){
x = s[i]-'a';
r += x*pt[nr-i];
}
v[++ind] = r;
x = scanf("%s\n", s);
}
qsort(v, ind+1, sizeof(v[0]), cmp);
lg = strlen(w);
lg --;
cnt = 0;
for (i=0; i<=nr; i++){
x = w[i]-'a';
cnt += pt[nr-i]*x;
}
z = caut(cnt);
if (cnt == v[z] && z > 0)
sol ++;
for (i=nr+1; i<lg; i++){
x = w[i]-'a';
cnt = (cnt - pt[nr]*(w[i-nr-1]-'a')) * 3 + x;
z = caut(cnt);
if (v[z] == cnt && z > 0)
sol ++;
}
printf("%u\n", sol);
fclose(stdin);
fclose(stdout);
return 0;
}