Pagini recente » Cod sursa (job #2540281) | Cod sursa (job #3262474) | Cod sursa (job #3262477) | Cod sursa (job #2909344)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int cnt = 1;
int v2[100000],v3[100000];
int p[100000];
vector <pair<int,char>> v[100000];
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;
}