Cod sursa(job #1343343)

Utilizator andreey_047Andrei Maxim andreey_047 Data 15 februarie 2015 12:47:18
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Coord{
 int x;
 char l;
};
vector<Coord>G[3000];
int n,s,g[1000001],k[100001];
inline void Adauga(char a[]){
 int i,ok,q,b,j;
 n=strlen(a);
 Coord w;
 q=b=1;
 for(i=0;i<n;i++){
        if(b){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
     if(!ok) {if(i==n-1)g[q]++;continue;}
     b=0;
    }
    w.x=++s;
    k[s]=1;
    w.l=a[i];
    G[q].push_back(w);
    q=s;
    if(i==n-1)
    g[s]=1;
 }
}
inline void Sterge(char a[]){
 int i,ok,q,b,j;
 n=strlen(a);
 Coord w;
 q=b=1;
 for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
     if(ok) return;
    if(i==n-1) g[q]--;
 }
 if(!g[q]){
     for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(G[q][j].l==a[i]){ok=0;q=G[q][j].x;}
    k[q]=0;
 }

 }
}
inline int Query(char a[]){
 int i,ok,q,b,j;
 n=strlen(a);
 Coord w;
 q=b=1;
 for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
    if(ok) return 0;
    if(i==n-1) return g[q];
 }
  return 0;
}
inline int AFLA(char a[]){
 int i,ok,q,b,j,s;
 n=strlen(a);
 Coord w;
 q=b=1;s=0;
 for(i=0;i<n;i++){
      ok=1;
    for(j=0;j<G[q].size()&&ok;j++)
    if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
   //if(g[q]) s=i;
    if(ok) return i;
 }
  return s;
}
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();
   // cout<<g[8];
    fout.close();
    return 0;
}