Cod sursa(job #3143126)

Utilizator NashikAndrei Feodorov Nashik Data 27 iulie 2023 19:45:03
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
//#include <iostream>
#include <fstream>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct Node{
    Node* alph[30];
    bool created[30];
    int val;
    int pr;
    Node(){
        for(int i=0;i<26;i++)
            created[i]=false;
        val=0;
        pr=0;
    }
};
struct Trie{
    Node* head;
    Trie(){
        head=new Node();
    }
    void addString(string s){
        int n=s.size();
        Node* curr=head;
        for(int i=0;i<n;i++){
            curr->pr++;
            if(curr->created[s[i]-'a']==false){
                curr->created[s[i]-'a']=true;
                curr->alph[s[i]-'a']=new Node();
            }
            curr=curr->alph[s[i]-'a'];
        }
        curr->val++;
        curr->pr++;
    }
    int countString(string s){
        int n=s.size();
        Node* curr=head;
        for(int i=0;i<n;i++){
            if(curr->created[s[i]-'a']==false){
                return 0;
            }
            curr=curr->alph[s[i]-'a'];
        }
        return curr->val;
    }
    void removeString(string s){
        int n=s.size();
        Node* curr=head;
        for(int i=0;i<n;i++){
            curr->pr--;
            if(curr->created[s[i]-'a']==false){
                curr->created[s[i]-'a']=true;
                curr->alph[s[i]-'a']=new Node();
            }
            curr=curr->alph[s[i]-'a'];
        }
        curr->val--;
        curr->pr--;
    }
    int prefixString(string s){
        int n=s.size();
        Node* curr=head;
        for(int i=0;i<n;i++){
            if(curr->created[s[i]-'a']==false or curr->alph[s[i]-'a']->pr==0){
                return i;
            }

            curr=curr->alph[s[i]-'a'];
        }
        return n;
    }
};
int main() {
    Trie trie;
    //trie.addString("gig");
    //cout<<trie.prefixString("gp");
    int cer;
    string s;
    while(cin>>cer>>s){
        //cout<<s<<"\n";
        if(cer==0){
            trie.addString(s);
        }
        if(cer==1){
            trie.removeString(s);
        }
        if(cer==2){
            cout<<trie.countString(s)<<"\n";
        }
        if(cer==3){
            cout<<trie.prefixString(s)<<"\n";
        }
    }
    return 0;
}