Cod sursa(job #940395)

Utilizator rudarelLup Ionut rudarel Data 16 aprilie 2013 09:05:13
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <algorithm>
 
using namespace std;
 
char text[10<<20];
unsigned n, lung, L, a[1<<16];
 
inline unsigned lungime(char *s, unsigned &x){
         unsigned k=0;
         x=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);
}