Cod sursa(job #2642401)

Utilizator oglindaoglinjoaraJohn Cena oglindaoglinjoara Data 15 august 2020 05:40:41
Problema Trie Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<bits/stdc++.h>
using namespace std;
int x;
string s;

class TrieNode {
  TrieNode **children;
  int cnt;
  int ending;
  
  public:
  TrieNode() {
    cnt = 0;
    ending = 0;
    children = new TrieNode*[26];
  }
  void insert(string &s, int ind) {
    ++cnt;
    if(ind == s.size()) {
      ++ending;
      return;
    }
    if(!children[s[ind]-'a']) children[s[ind]-'a'] = new TrieNode();
    children[s[ind]-'a']->insert(s, ind+1);      
  }
  void del(string &s, int ind) {
    --cnt;
    if(ind == s.size()) {
      --ending;
      return;
    }
    children[s[ind]-'a']->del(s, ind+1);
  }
  int count(string &s, int ind) {
    if(ind == s.size()) {
      return ending;
    }
    if(!children[s[ind]-'a']) return 0;
    return children[s[ind]-'a']->count(s, ind+1);  
  }
  int lp(string &s, int ind) {
    if(!cnt) return max(0, ind-1);
    if(ind == s.size() || !children[s[ind]-'a']) {
      return ind;
    }
    return children[s[ind]-'a']->lp(s, ind+1);  
  }
};



int main() {	
  freopen("trie.in","r",stdin);
  freopen("trie.out","w",stdout);
  TrieNode* root = new TrieNode();
  while(cin>>x>>s) {
    if(x == 0) root->insert(s, 0);
    if(x == 1) root->del(s, 0);
    if(x == 2) cout<<root->count(s, 0)<<"\n";
    if(x == 3) cout<<root->lp(s, 0)<<"\n";
  }
  
}