Pagini recente » Cod sursa (job #1857532) | Cod sursa (job #243357) | Cod sursa (job #1382102) | Cod sursa (job #1787230) | Cod sursa (job #1343343)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Coord{
int x;
char l;
};
vector<Coord>G[3000];
int n,s,g[1000001],k[100001];
inline void Adauga(char a[]){
int i,ok,q,b,j;
n=strlen(a);
Coord w;
q=b=1;
for(i=0;i<n;i++){
if(b){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
if(!ok) {if(i==n-1)g[q]++;continue;}
b=0;
}
w.x=++s;
k[s]=1;
w.l=a[i];
G[q].push_back(w);
q=s;
if(i==n-1)
g[s]=1;
}
}
inline void Sterge(char a[]){
int i,ok,q,b,j;
n=strlen(a);
Coord w;
q=b=1;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
if(ok) return;
if(i==n-1) g[q]--;
}
if(!g[q]){
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(G[q][j].l==a[i]){ok=0;q=G[q][j].x;}
k[q]=0;
}
}
}
inline int Query(char a[]){
int i,ok,q,b,j;
n=strlen(a);
Coord w;
q=b=1;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
if(ok) return 0;
if(i==n-1) return g[q];
}
return 0;
}
inline int AFLA(char a[]){
int i,ok,q,b,j,s;
n=strlen(a);
Coord w;
q=b=1;s=0;
for(i=0;i<n;i++){
ok=1;
for(j=0;j<G[q].size()&&ok;j++)
if(G[q][j].l==a[i]&&k[G[q][j].x]){ok=0;q=G[q][j].x;}
//if(g[q]) s=i;
if(ok) return i;
}
return s;
}
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();
// cout<<g[8];
fout.close();
return 0;
}