Pagini recente » Cod sursa (job #2381633) | Cod sursa (job #2025656) | Cod sursa (job #1852779) | Cod sursa (job #1884009) | Cod sursa (job #1343371)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
vector<int>G[30];
int n,s,g[1000001],c[1000001];
char l[1000001];
inline void Adauga(char a[]){
int i,ok,q,b,j;
n=strlen(a);
q=b=1;
for(i=0;i<n;i++){
if(b){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];c[q]++;}
if(!ok) {if(i==n-1)g[q]++;continue;}
b=0;
}
G[q].push_back(++s);
l[s]=a[i];
c[s]=1;
q=s;
if(i==n-1)
g[s]=1;
}
}
inline void Sterge(char a[]){
int i,ok,q,j,p;
n=strlen(a);
q=1;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];}
if(ok) return;
if(i==n-1) g[q]--;
}
if(!g[q]){
q=1;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(l[G[q][j]]==a[i]){ok=0;p=G[q][j];c[G[q][j]]--;if(!c[G[q][j]])G[q].erase(find(G[q].begin(),G[q].end(),p));q=p;}
}
}
}
inline int Query(char a[]){
int i,ok,q,j;
n=strlen(a);
q=1;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];}
if(ok) return 0;
if(i==n-1) return g[q];
}
return 0;
}
inline int AFLA(char a[]){
int i,ok,q,j;
n=strlen(a);
q=1;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(l[G[q][j]]==a[i]){ok=0;q=G[q][j];}
if(ok) return i;
}
return n;
}
int main(){
int key;
char a[25];
s=1;
while(fin>>key){
fin>>a;
if(key==0)
Adauga(a);
else if(key == 1)
Sterge(a);
else if(key == 2)
fout<<Query(a)<<'\n';
else if(key == 3)
fout<<AFLA(a)<<'\n';
}
fin.close();
fout.close();
return 0;
}