Cod sursa(job #2514736)

Utilizator bigmixerVictor Purice bigmixer Data 26 decembrie 2019 18:24:01
Problema Trie Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <bits/stdc++.h>
#define ll long long
#define all(a) (a).begin(), (a).end()
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define sz() size()
#define fr first
#define sc second
#define pb push_back
#define er erase
#define in insert
#define pi pair<int,int>
#define pii pair<pair<int,int>,int>
#define mp make_pair
//#define int long long
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)
using namespace std;


const int mod=1e9+7;
const int modx=998244353;
const int per=666013;

ifstream fin("trie.in");
ofstream fout("trie.out");

int x,indx;
string s;

struct Trie{
    int val,next[26],app;
    Trie(){
        app=0;
        val=0;
        memset(next,0,sizeof(next));
    }
}tz;

vector<Trie>vecc;

void inser(string s1){
    int curr=0;
    vecc[curr].app++;
    for(int i=0;i<s1.size();i++){
        int c = (s1[i]-'a');
        if(vecc[curr].next[c]==0){
            vecc[curr].next[c]=(++indx);
            vecc.push_back(tz);
        }
        curr=vecc[curr].next[c];
        vecc[curr].app++;
        if(i==s1.size()-1) vecc[curr].val++;
    }
}

void delet(string s1){
    int curr=0;
    vecc[curr].app--;
    for(int i=0;i<s1.size();i++){
        int c=(s1[i]-'a');
        curr=vecc[curr].next[c];
        vecc[curr].app--;
        if(i==s1.size()-1) vecc[curr].val--;
    }
}

void ans(string s1){
    int curr=0;
    for(int i=0;i<s1.size();i++){
        int c = (s1[i]-'a');
        curr=vecc[curr].next[c];
        if(i==s1.size()-1) fout << vecc[curr].val << '\n';
    }
}

void ans2(string s1){
    int curr=0,anst=0;
    for(int i=0;i<s1.size();i++){
        int c=(s1[i]-'a');
        if(vecc[curr].next[c]==0) break;
        curr=vecc[curr].next[c];
        if(vecc[curr].app>0) anst=(i+1);
    }
    fout << anst << '\n';
}

int32_t main(){
	//ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
    srand(chrono::steady_clock::now().time_since_epoch().count());
    vecc.push_back(tz);
    while(fin >> x >> s){
        if(x==0) inser(s);
        if(x==1) delet(s);
        if(x==2) ans(s);
        if(x==3) ans2(s);
    }

}