Pagini recente » Cod sursa (job #21690) | Cod sursa (job #1284392) | Cod sursa (job #274093) | Cod sursa (job #3261189) | Cod sursa (job #99085)
Cod sursa(job #99085)
#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){ //god damn tries
unsigned poz=0; //binary search rulz
#define W(i) if (a[poz+(1u<<i)]<=k) poz+=(1u<<i);
W(15) W(14) W(13) W(12) W(11) W(10) W(9)
W(8) W(7) W(6) W(5) W(4) W(3) W(2) W(1) W(0)
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);
}