Cod sursa(job #3145846)

Utilizator Luca07Nicolae Luca Luca07 Data 17 august 2023 11:32:10
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 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 {
    char val;
    int cnt;
    int location;
    multiset<string> ends;
    map<char, int> fr;
};

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


void addWord(int level,string::iterator it,string::iterator end,string word) {
    int id = toIndex(*it);
    levels[level][id].cnt++;

    it++;
    if (it == end) {
        levels[level][id].ends.insert(word);
        return;
    }
    levels[level][id].fr[*it]++;
    addWord(level+1, it, end, word);
}

void deleteWord(int level,string::iterator it, string::iterator end, string word) {
    int id = toIndex(*it);
    levels[level][id].cnt--;

    it++;
    if (it == end) {
        levels[level][id].ends.erase(word);
        return;
    }
    levels[level][id].fr[*it]--;
    
    deleteWord(level+1, it, end, word);
}

int appearances(int level, string::iterator it, string::iterator end,string word) {
    int id = toIndex(*it);
    if (levels[level][id].cnt == 0)
        return 0;

    it++;
    if (it == end) {
        return levels[level][id].ends.count(word);
    }

    int cnt = levels[level][id].fr[*it];
    if (cnt == 0)
        return 0;

    return appearances(level+1, it, end,word);
}

int longestPrefix(int level, string::iterator it, string::iterator end) {
    int id = toIndex(*it);
    if (levels[level][id].cnt == 0)
        return 0;

    it++;
    if (it == end) {
        return levels[level][id].cnt;
    }

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

    return longestPrefix(level + 1, it, end)+1;
}

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

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

    return 0;
}