Cod sursa(job #1376922)

Utilizator turbowin120Amarandei-Stanescu Alexandru turbowin120 Data 5 martie 2015 19:24:27
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <stdio.h>
using namespace std;
const int N=10000003,M=50001;
const int P=666269;
int val[M],urm[22],lst[P+1],cuv[22];
char s[N],c[21];
int m,poz,cnt;

bool caut(int nr){
    int r=nr%P;
    int p=lst[r];
    while(p!=0){
        if(val[p]==nr) return 1;
        p=urm[p];

    }
    return 0;
}

unsigned long long puteri[20];


void adauga (int nr, int p){

    if(caut(nr)==0){

    int r=nr%P;
    val[++poz]=nr;
    urm[poz]=lst[r];
    lst[r]=poz;
    cuv[poz]=p;
    }
}


int s2[N];
void rez(){
    int masca=0,lung=0;
    while(s[lung]=='a'||s[lung]=='b'||s[lung]=='c'){
        s2[lung]=s[lung]-'a';
        lung++;
    }
    for(int i=0;i<m;i++) masca+=puteri[i]*(s2[i]);

    cnt+=caut(masca);
    int putere=1;
    for(int i=1;i<m;i++) putere=putere*3;

    for(int i=m;i<=lung;i++){
        masca=masca/3;
        masca=masca+(putere*s2[i]);
    cnt+=caut(masca);
    }


}

void citire(){
    FILE *in;
    in=fopen("abc2.in","r");
    fgets(s,N,in);
    int k=1,nr;
    fgets(c,21,in);
    while(c[m]>='a'&&c[m]<='z') m++;
    puteri[0]=1;

    for(int i=1;i<=20;i++) puteri[i]=puteri[i-1]*3;
    do{
        nr=0;
        for(int i=0;i<m;i++) nr+=puteri[i]*(c[i]-'a');
        adauga(nr,k++);
    }while(fgets(c,21,in)!=0);

}

int main()
{
    citire();
    rez();
    FILE *out;
    out=fopen("abc2.out","w");
    fprintf(out,"%d",cnt);
    return 0;
}