Pagini recente » Cod sursa (job #903976) | Cod sursa (job #893791) | Cod sursa (job #2095945) | Cod sursa (job #777371) | Cod sursa (job #107532)
Cod sursa(job #107532)
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
const int N_MAX = 10000010;
const int L_MAX = 22;
const int C_MAX = 50010;
char sir[N_MAX], s[N_MAX];
unsigned int cuv[C_MAX];
int l1, L, nrcuv;
unsigned int trei[L_MAX];
void transf(char s[], int poz)
{
int i;
for (i = 0; i < l1; i ++) {
cuv[poz] += (unsigned int) (s[i] - 'a') * trei[i];
}
}
int find(unsigned int val)
{
int i, step;
for (step = 1; step < nrcuv; step <<= 1);
for (i = 0; step; step >>= 1) {
if (i + step <= nrcuv && cuv[i + step] <= val) i += step;
}
if (cuv[i] == val && i > 0) return 1;
return 0;
}
int main()
{
freopen("abc2.in", "r", stdin);
#ifndef _SCREEN_
freopen("abc2.out", "w", stdout);
#endif
int i;
//puterile lui 3
trei[0] = 1;
for (i = 1; i <= 20; i ++) {
trei[i] = trei[i - 1] * 3;
}
//end of puterile lui 3
scanf("%s\n", sir);
L = strlen(sir);
sir[L] = '\0';
if (scanf("%s\n", s) != EOF) {
l1 = strlen(s);
nrcuv ++;
transf(s, nrcuv);
}
while (scanf("%s\n", s) != EOF) {
nrcuv ++;
transf(s, nrcuv);
}
if (nrcuv) {
sort(cuv + 1, cuv + nrcuv + 1);
unsigned int nr = 0;
for (i = 0; i < l1; i ++) {
nr += (unsigned int) (sir[i] - 'a') * trei[i];
}
int rez = 0, poz = 0;
if (find(nr)) rez ++;
for (i = l1; i < L; i ++) {
nr -= (sir[poz] - 'a');
nr /= 3;
nr += (unsigned int) ((sir[i] - 'a') * trei[l1 - 1]);
poz ++;
if (find(nr)) rez ++;
}
printf("%d\n", rez);
} else printf("0\n");
return 0;
}