Cod sursa(job #2875169)

Utilizator popescuadrianpopescuadrian popescuadrian Data 21 martie 2022 10:38:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <vector>
#include <map>

using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
map<string,int>mp;
int fre[2000005];
int cara[2000005];
int noduri=0;
vector<int> adj[2000005];
void update (string s,int semn)
{
    int curr,build,k,i,val,j;
    curr=0;
    for(i=0;i<s.size();i++)
    {
        build=1;
        val=s[i]-'a';
        for(j=0;j<adj[curr].size();j++)
        {
            k=adj[curr][j];
            if(cara[k]==val)
            {
                build=0;
                curr=k;
                fre[k]=fre[k]+semn;
                break;
            }
        }
        if(build==1)
        {
            noduri++;
            adj[curr].push_back(noduri);
            fre[noduri]=semn;
            cara[noduri]=val;
            curr=noduri;
        }
    }
}
int querry (string s)
{
    int curr,build,k,i,val,j;
    curr=0;
    for(i=0;i<s.size();i++)
    {
        build=1;
        val=s[i]-'a';
        for(j=0;j<adj[curr].size();j++)
        {
            k=adj[curr][j];
            if(cara[k]==val)
            {
                build=0;
                curr=k;
                break;
            }
        }
        if(build==1)
        {
            return i;
        }
        else if(fre[curr]<=0)
        {
            return i;
        }
    }
}
int main()
{
    int n,i,j,k,tip;
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string s;
    while(cin>>tip>>s)
    {
        if(tip==0)
        {
            mp[s]++;
            update(s,1);
        }
        else if(tip==1)
        {
            mp[s]--;
            update(s,-1);
        }
        else if(tip==2)
        {
            cout<<mp[s]<<'\n';
        }
        else
        {
            cout<<querry(s)<<'\n';
        }
    }
    return 0;
}