Cod sursa(job #3145865)

Utilizator Luca07Nicolae Luca Luca07 Data 17 august 2023 12:27:34
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.76 kb
#include <fstream>
#include<vector>
#include<set>
#include<algorithm>
#include<map>
using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

multiset<string> ms;


int toIndex(char ch) {
    return (int)ch-97;
}

char toChar(int i) {
    return (char)(i + 97);
}

int index = 1;

struct Element {
    int cnt;
    map<string,int> ends;
    map<char, int> fr;
    map<char, Element> next;
};

vector<vector<Element>> levels = vector<vector<Element>>(30, vector<Element>(26));

map<char, Element> start;

void addWord(Element& e,string::iterator it,string::iterator end,string word) {
    int id = toIndex(*it);
    e.cnt++;

    it++;
    if (it == end) {
        e.ends[word]++;
        return;
    }
    e.fr[*it]++;
    addWord(e.next[*it], it, end, word);
}

void deleteWord(Element& e,string::iterator it, string::iterator end, string word) {
    int id = toIndex(*it);
    e.cnt--;

    it++;
    if (it == end) {
        e.ends[word]--;
        return;
    }
    e.fr[*it]--;
    
    deleteWord(e.next[*it], it, end, word);
}

int appearances(Element& e, string::iterator it, string::iterator end,string word) {
    int id = toIndex(*it);
    if (e.cnt == 0)
        return 0;

    it++;
    if (it == end) {
        return e.ends[word];
    }

    int cnt = e.fr[*it];
    if (cnt == 0)
        return 0;

    return appearances(e.next[*it], it, end,word);
}


int longestPrefix(Element& e, string::iterator it, string::iterator end) {
    int id = toIndex(*it);
    if (e.cnt == 0)
        return 0;

    it++;
    if (it == end) {
        return 1;
    }

    int cnt = e.fr[*it];
    if (cnt == 0)
        return 1;

    return longestPrefix(e.next[*it], it, end) + 1;
}


int main()
{
    int i, j, n, nr,k,a;
    string s, input;
    nr = 0;
    

    while (cin >> a>>input) {
        /*if (starting[*input.begin()] == 0) {
            gdata.push_back({});
            gdata[index].val = *input.begin();
            gdata[index].location = index;
        }*/
        if (a == 2 || a == 3)
            nr++;
        if (nr == 5241) {
            j = 0;
       }
        switch (a) {
        case 0:
            addWord(start[*input.begin()], input.begin(), input.end(), input);
            break;
        case 1:
            //levels[0][toIndex(*input.begin())].cnt--;
            deleteWord(start[*input.begin()], input.begin(), input.end(), input);
            break;
        case 2:
            cout<<appearances(start[*input.begin()], input.begin(), input.end(),input)<<"\n";
            break;
        case 3:
            cout << longestPrefix(start[*input.begin()],input.begin(), input.end()) << "\n";
            break;
        }
    }

    return 0;
}