Pagini recente » Cod sursa (job #3240673) | Cod sursa (job #48953) | Cod sursa (job #2670498) | Cod sursa (job #138349) | Cod sursa (job #653322)
Cod sursa(job #653322)
#include<fstream>
#include<iostream>
#include<vector>
#include<string.h>
#include<string>
using namespace std;
vector<int> vec[200001];
char lit[200001];
int nr[200001];
int sf[200001];
int ct=0;
char lol[26];
int n;
void adauga(int nod,int cur){
if(cur<=n){
int i;
short ok=0;
for(i=0;i<vec[nod].size();i++){
if(lit[vec[nod][i]]==lol[cur+1]){
adauga(vec[nod][i],cur+1);
ok=1;
}
}
if(ok==0){
ct++;
vec[nod].push_back(ct);
adauga(vec[nod][vec[nod].size()-1],cur+1);
}
if(nod!=0){
lit[nod]=lol[cur];
nr[nod]++;
if(cur==n)
sf[nod]++;
}
}
}
void sterge(int nod,int cur){
nr[nod]--;
if(cur==n)
sf[nod]--;
if(cur<n){
int i;
for(i=0;i<vec[nod].size();i++){
if(lit[vec[nod][i]]==lol[cur+1]){
sterge(vec[nod][i],cur+1);
}
}
}
}
int numar(int nod,int cur){
if(cur==n)
return sf[nod];
short ok=0;
if(cur<n){
int i;
for(i=0;i<vec[nod].size();i++){
if(lit[vec[nod][i]]==lol[cur+1]){
return numar(vec[nod][i],cur+1);
ok=1;
}
}
}
if(ok==0)
return 0;
}
int maxi=0;
void prefix(int nod,int cur){
if(nr[nod]>0)
maxi++;
if(cur<n){
int i;
for(i=0;i<vec[nod].size();i++){
if(lit[vec[nod][i]]==lol[cur+1]){
prefix(vec[nod][i],cur+1);
}
}
}
}
int main(){
ifstream f("trie.in");
ofstream g("trie.out");
int x;
f>>x>>lol;
do{
maxi=0;
n=strlen(lol)-1;
if(x==0)
adauga(0,-1);
if(x==1)
sterge(0,-1);
if(x==2)
g<<numar(0,-1)<<"\n";
if(x==3){
prefix(0,-1);
g<<maxi<<"\n";
}
f>>x>>lol;
}while(!f.eof());
return 0;
}