Pagini recente » Cod sursa (job #482971) | Cod sursa (job #742843) | Cod sursa (job #827746) | Cod sursa (job #804408) | Cod sursa (job #2922146)
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
int noNodes;
struct Node{
int edges[26];
int valfinal=0,val=0;
bool isFinal;
inline int getEdge(char c){
return !edges[c-'a']?-1:edges[c-'a'];
}
inline int addEdge(char c){
if(!edges[c-'a']){
edges[c-'a']=++noNodes;
}
val++;
return edges[c-'a'];
}
inline void deletec(char c){
edges[c-'a']=0;
}
};
#define MAX_N 2000000
Node nodes[MAX_N];
void addWord(const char* word){
int i=0,current=0;
while(word[i])
current=nodes[current].addEdge(word[i++]);
nodes[current].isFinal=true;
nodes[current].valfinal++;
nodes[current].val++;
}
void deletWord(const char* word){
int i=0,current=0,b=0;
while(word[i]){
b=current;
current=nodes[current].getEdge(word[i++]);
nodes[current].val--;
if(nodes[current].val==0)
nodes[b].deletec(word[i-1]);
}
nodes[current].valfinal--;
if(nodes[current].valfinal==0)
nodes[current].isFinal=false;
}
int nrWord(const char* word){
int i=0,current=0;
while(word[i] && current!=-1)
current=nodes[current].getEdge(word[i++]);
if(current!=-1)
return nodes[current].valfinal;
return 0;
}
int prefixWord(const char* word){
int i=0,current=0;
while(word[i] && current!=-1)
current=nodes[current].getEdge(word[i++]);
if(current==-1)
i--;
return i;
}
int main(){
FILE *fin,*fout;
int i;
char word[21],c='a',k;
fin=fopen("trie.in","r");
fout=fopen("trie.out","w");
k=fgetc(fin);
while(k>='0' && k<='3'){
memset(word,0,sizeof(word));
c=fgetc(fin);
c=fgetc(fin);
i=0;
while(c!=EOF && c!='\n'){
word[i++]=c;
c=fgetc(fin);
}
if(k=='0'){
addWord(word);
}else if(k=='1'){
deletWord(word);
}else if(k=='2'){
fprintf(fout,"%d\n",nrWord(word));
}else if(k=='3'){
fprintf(fout,"%d\n",prefixWord(word));
}
k=fgetc(fin);
}
fclose(fin);
fclose(fout);
return 0;
}