Cod sursa(job #2888865)

Utilizator Max_CalincuMaxim Calincu Max_Calincu Data 11 aprilie 2022 21:52:11
Problema Trie Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;

typedef int ll;
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define pi pair<ll, ll>
#define sz(x) (int)((x).size())
#define all(a) (a).begin(), (a).end()

/*const ll maxn = 1e5;
int f[maxn],nf[maxn],inv[maxn];
const int M=998244353;
void init(){
    inv[1]=1; for (int i=2;i<maxn;i++) inv[i]=M-1ll*(M/i)*inv[M%i]%M;
    f[0]=nf[0]=1; for (int i=1;i<maxn;i++) f[i]=1ll*f[i-1]*i%M,nf[i]=1ll*nf[i-1]*inv[i]%M;
}
int C(int x,int y){return 1ll*f[x]*nf[y]%M*nf[x-y]%M;} */

const ll mod = 1e9+7;
ll n, k, m, mi, ma;
const ll N = 2e6 + 10;

struct point{
	map<ll, ll> q;
	ll count;
	ll ch;	
} a[N];
ll cur;
string s;

void add(ll i, ll now){
	
	a[i].ch++;
	if(now == s.size()) {
		a[i].count++;
		return;
	}
	if(a[i].q[s[now]] == 0){
		a[i].q[s[now]] = cur;
		cur++;
	}
	add(a[i].q[s[now]], now + 1);
	
}

void remove(ll i, ll now){
	
	a[i].ch--;
	if(now == s.size()){
		a[i].count--;
		return;
	}
	remove(a[i].q[s[now]], now + 1);

}

ll numara(ll i, ll now){
	if(now == s.size()) return a[i].count;
	return numara(a[i].q[s[now]], now + 1);
}

ll search(ll i, ll now){
	if(a[i].ch == 0) return max(0, now - 1);
	if(now == s.size()) return now;
	if(a[i].q[s[now]] == 0) return now;
	return search(a[i].q[s[now]], now + 1);
}


void solve(){
	
	ifstream cin("trie.in");
	ofstream cout("trie.out");
	
	cur = 2;
	ll x;
	while(cin >> x >> s){
		if(x == 0) add(1, 0);
		if(x == 1) remove(1, 0);
		if(x == 2) cout << numara(1, 0) << "\n";		
		if(x == 3) cout << search(1, 0) << "\n";
	}
	

}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);

	//init();
	
	int t=1;
	//cin >> t;
	while(t--) solve();
	
	return 0;
}