Cod sursa(job #2909345)

Utilizator CReaper1116Shang Cheng Lin CReaper1116 Data 13 iunie 2022 00:03:56
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int cnt = 1;
int v2[100001],v3[100001];
int p[100001];
vector <pair<int,char>> v[100001];
int dfs(int& pos,char& ch){
	for(auto i:v[pos]){
		if(i.second == ch){
			return i.first;
		};
	}
	return cnt;
}
int dfs2(int& pos){
	int ans = 0;
	for(auto i:v[pos]){
		ans+=v2[i.first];
	}
	return ans;
}
void add(string& s){
	int pos = 0,i,pos2;
	for(i = 0;i < s.size();i++){
		pos2 = dfs(pos,s[i]);
		if(pos2 == cnt){
			///does not exist
			v[pos].push_back({cnt,s[i]});
			p[cnt] = pos;
			cnt++;
		}
		pos = pos2;
	}
	for(i = pos;i != 0;i = p[i]){
		v3[i]++;
	}
	v2[pos]++;
}
void rmove(string& s){
	int pos = 0,i;
	for(i = 0;i < s.size();i++){
		pos = dfs(pos,s[i]);
		if(pos == cnt)return;
	}
	v2[pos]--;
	for(i = pos;i != 0;i = p[i]){
		v3[i]--;
	}
}
int srch(string& s,int cer){
	int pos = 0,i;
	for(i = 0;i < s.size();i++){
		pos = dfs(pos,s[i]);
		if(pos == cnt){
			return 0;
		}
	}
	return v2[pos];
}
int srch2(string& s,int cer){
	int pos = 0,i,maxx = 0;
	for(i = 0;i < s.size();i++){
		pos = dfs(pos,s[i]);
		if(pos == cnt){
			return maxx;
		}else if(v3[pos] > 0)maxx = i + 1;
	}
	return maxx;
}
int main()
{
	int cer;
	string s;
	while(fin>>cer>>s){
		if(cer == 0)add(s);
		else if(cer == 1)rmove(s);
		else if(cer == 2){
			fout<<srch(s,cer)<<'\n';
		}else fout<<srch2(s,cer)<<'\n';
	}
    return 0;
}