Pagini recente » Cod sursa (job #2064318) | Cod sursa (job #99043)
Cod sursa(job #99043)
#include <stdio.h>
#include <algorithm>
#include <cmath>
#define x first
#define y second
using namespace std;
char text[10<<20];
unsigned n, lung, L, a[1<<16];
inline unsigned lungime(char *s, unsigned &x){
unsigned k=0;
while ('a'<=s[k] && s[k]<='c')
x = 3*x + (s[k++]-'a');
return k;
}
inline int exista(unsigned k){
unsigned poz=0;
for (int p=15; p>=0; p--)
if (a[poz+(1<<p)]<=k) poz+=(1u<<p);
return a[poz]==k;
}
int main()
{
unsigned i;
freopen("abc2.in", "r", stdin);
freopen("abc2.out", "w", stdout);
fgets(text, 10<<22, stdin);
char lin[30];
fgets(lin, 30, stdin);
lung = lungime(lin, a[0]);
while (lungime(lin, a[++n])==lung){
if (fgets(lin, 30, stdin)==NULL){
n++;
break;
}
}
n--;
sort(a, a+n);
for (i=n; i<(1<<16); i++)
a[i] = a[n-1];
unsigned nr,sol, pow=1;
for (i=1; i<lung; i++)
pow*=3;
for (i=nr=0; i<lung; i++)
nr=nr*3+(text[i]-'a');
while ('a'<=text[L] && text[L]<='c') L++;
for (i=lung, sol=exista(nr); i<L; i++){
nr-=(text[i-lung]-'a')*pow;
nr=3*nr+(text[i]-'a');
sol += exista(nr);
}
printf("%d\n", sol);
}