Cod sursa(job #1222794)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 24 august 2014 13:49:14
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <vector>
#include <queue>
#include <set>
#define DIM 10000010
#define DIM1 50011
using namespace std;
ifstream f("abc2.in");
ofstream g("abc2.out");
int k;

struct trie{
    int sol;
    trie *p[26],*ret;
    vector<trie *> v;
    trie(){
        sol=0;
        ret=0;
        for(int i=0;i<26;i++) p[i]=0;
        v.clear();
    }
};

trie *root,*nod,*aux;
char S[DIM],A[30],*P;

set<trie *> w;
queue<trie *> Q;

trie *update(trie *r,char *s){
    if(*s){
        if(!r->p[*s-'a'])
            r->p[*s-'a']=new trie;
        return update(r->p[*s-'a'],s+1);
    }
    else
        return r;
}

void dfs(trie *nod){
    for(register int i=0;i<nod->v.size();i++){
        dfs(nod->v[i]);
        nod->sol+=nod->v[i]->sol;
    }
}

int main(void){
    register int i,j;
    set<trie *>::iterator it;

    f>>S;

    root=new trie;
    while(f>>A)
        w.insert(update(root,A));

    Q.push(root);

    while(!Q.empty()){
        nod=Q.front();
        Q.pop();
        for(i=0;i<26;i++){
            if(nod->p[i]){
                aux=nod->ret;
                while(aux && aux->p[i]==NULL) aux=aux->ret;

                if(aux==0)
                    nod->p[i]->ret=root;
                else
                    nod->p[i]->ret=aux->p[i];
                nod->p[i]->ret->v.push_back(nod->p[i]);
                Q.push(nod->p[i]);
            }
        }
    }

    nod=root;
    for(P=S;*P;P++){
        while(nod!=root && nod->p[*P-'a']==NULL)  nod=nod->ret;
        if(nod->p[*P-'a']!=NULL) nod=nod->p[*P-'a'];
        nod->sol++;
    }

    dfs(root);

    int nr=0;
    for(it=w.begin();it!=w.end();it++)
        nr+=(*it)->sol;
    g<<nr;
    f.close();
    g.close();
    return 0;
}