Cod sursa(job #653318)

Utilizator johnny2008Diaconu Ion johnny2008 Data 27 decembrie 2011 19:28:55
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#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;
}