Cod sursa(job #1343371)

Utilizator andreey_047Andrei Maxim andreey_047 Data 15 februarie 2015 13:49:38
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
vector<int>G[30];
int n,s,g[1000001],c[1000001];
char l[1000001];
inline void Adauga(char a[]){
 int i,ok,q,b,j;
 n=strlen(a);
 q=b=1;
 for(i=0;i<n;i++){
        if(b){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];c[q]++;}
     if(!ok) {if(i==n-1)g[q]++;continue;}
     b=0;
    }
    G[q].push_back(++s);
    l[s]=a[i];
    c[s]=1;
    q=s;
    if(i==n-1)
    g[s]=1;
 }
}
inline void Sterge(char a[]){
 int i,ok,q,j,p;
 n=strlen(a);
 q=1;
 for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];}
     if(ok) return;
    if(i==n-1) g[q]--;
 }
 if(!g[q]){
        q=1;
     for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(l[G[q][j]]==a[i]){ok=0;p=G[q][j];c[G[q][j]]--;if(!c[G[q][j]])G[q].erase(find(G[q].begin(),G[q].end(),p));q=p;}
 }

 }
}
inline int Query(char a[]){
 int i,ok,q,j;
 n=strlen(a);
 q=1;
 for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];}
    if(ok) return 0;
    if(i==n-1) return g[q];
 }
  return 0;
}
inline int AFLA(char a[]){
 int i,ok,q,j;
 n=strlen(a);
 q=1;
 for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];}
    if(ok) return i;
 }
  return n;
}
int main(){
    int key;
    char a[25];
    s=1;
    while(fin>>key){
          fin>>a;
         if(key==0)
            Adauga(a);
         else if(key == 1)
            Sterge(a);
         else if(key == 2)
            fout<<Query(a)<<'\n';
         else if(key == 3)
            fout<<AFLA(a)<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}