Cod sursa(job #2922349)

Utilizator albertaizicAizic Albert albertaizic Data 7 septembrie 2022 23:24:16
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;

int noNodes;

struct Node{
  int edges[26];
  int valfinal=0,val=0;
  bool isFinal;

  inline int getEdge(char c){
    return !edges[c-'a']?-1:edges[c-'a'];
  }

  inline int addEdge(char c){
    if(!edges[c-'a']){
      edges[c-'a']=++noNodes;
    }
    val++;
    return edges[c-'a'];
  }
  inline void deletec(char c){
    edges[c-'a']=0;
  }
};

#define MAX_N 500000
Node nodes[MAX_N];
void addWord(const char* word){
  int i=0,current=0;
  while(word[i])
    current=nodes[current].addEdge(word[i++]);
  nodes[current].isFinal=true;
  nodes[current].valfinal++;
  nodes[current].val++;
}

void deletWord(const char* word){
  int i=0,current=0,b=0;
  while(word[i]){
    b=current;
    current=nodes[current].getEdge(word[i++]);
    nodes[current].val--;
    if(nodes[current].val==0)
      nodes[b].deletec(word[i-1]);
  }
  nodes[current].valfinal--;
  if(nodes[current].valfinal==0)
    nodes[current].isFinal=false;
}

int nrWord(const char* word){
  int i=0,current=0;

  while(word[i] && current!=-1)
    current=nodes[current].getEdge(word[i++]);
  if(current!=-1)
    return nodes[current].valfinal;
  return 0;
}

int prefixWord(const char* word){
  int i=0,current=0;
  while(word[i] && current!=-1)
    current=nodes[current].getEdge(word[i++]);
  if(current==-1)
    i--;
  return i;
}

int main(){
  FILE *fin,*fout;
  int i;
  char word[21],c='a',k;
  fin=fopen("trie.in","r");
  fout=fopen("trie.out","w");
  k=fgetc(fin);
  while(k>='0' && k<='3'){
    memset(word,0,sizeof(word));
    c=fgetc(fin);
    c=fgetc(fin);
    i=0;
    while(c!=EOF && c!='\n'){
      word[i++]=c;
      c=fgetc(fin);
    }
    if(k=='0'){
      addWord(word);
    }else if(k=='1'){
      deletWord(word);
    }else if(k=='2'){
      fprintf(fout,"%d\n",nrWord(word));
    }else if(k=='3'){
      fprintf(fout,"%d\n",prefixWord(word));
    }
    k=fgetc(fin);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}