Pagini recente » Cod sursa (job #658434) | Cod sursa (job #1553950) | Cod sursa (job #2152832) | Cod sursa (job #2273000) | Cod sursa (job #653318)
Cod sursa(job #653318)
#include<fstream>
#include<iostream>
#include<vector>
#include<string.h>
#include<string>
using namespace std;
vector<int> vec[100001];
char lit[100001];
int nr[100001];
int sf[100001];
int ct=0;
char lol[22];
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 no;
string noo;
int main(){
ifstream f("trie.in");
ofstream g("trie.out");
do{
int x;
f>>x>>lol;
if(no==x && lol==noo){
return 0;
}
no=x;
noo=lol;
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";
}
}while(!f.eof());
return 0;
}