Cod sursa(job #744002)

Utilizator keisecGinghina Cristian keisec Data 6 mai 2012 22:08:25
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<iostream>
#include<string>
#include<fstream>
#include<cstdio>

using namespace std;
int S[1000];
struct AFD
{
	int q0,nr_stari,q_act,tranz[1000][26];
	bool finale[1000];
};

void init(AFD&a)
{
	int nf,nt;
	a.q0=0;
	a.nr_stari=1;
	for(int i1=0;i1<100;i1++)
	{
		a.finale[i1]=false;
		S[i1]=0;
	}
	for(int i=0;i<100;i++)
		for(int j=0;j<26;j++)
			a.tranz[i][j]=-1;
}

int aparitii(AFD a,string s)
{
	a.q_act=a.q0;
	for(int i=0;i<s.length();i++)
	{
		if(a.tranz[a.q_act][s[i]-'a']==-1)return 0;
		a.q_act=a.tranz[a.q_act][s[i]-'a'];
	}
	if(a.finale[a.q_act])return S[a.q_act];
	return 0;
}

int prefix(AFD a,string s)
{
	a.q_act=a.q0;
	for(int i=0;i<s.length();i++)
	{
		if(a.tranz[a.q_act][s[i]-'a']==-1)return i;
		a.q_act=a.tranz[a.q_act][s[i]-'a'];
	}
	return s.length();
}


void adaug(AFD&a,string s)
{
	a.q_act=a.q0;
	int x;
	for(int i=0;i<s.length();i++)
	{
		if(a.tranz[a.q_act][s[i]-'a']==-1)
			for(int j=1;j<1000;j++)
				if(S[j]==0)
				{
					a.tranz[a.q_act][s[i]-'a']=j;
					break;
				}
		a.q_act=a.tranz[a.q_act][s[i]-'a'];
		S[a.q_act]++;
	}
	a.finale[a.q_act]=true;
}

void stergere(AFD&a,string s)
{
	a.q_act=a.q0;
	for(int i=0;i<s.length();i++)
	{
		int aux=a.q_act;
		a.q_act=a.tranz[a.q_act][s[i]-'a'];
		S[a.q_act]--;
		if(S[a.q_act]==0){
			a.tranz[aux][s[i]-'a']=-1;
		}
	}
	if(S[a.q_act]==0)
		a.finale[a.q_act]=false;
}
int main()
{
	ifstream f("trie.in");
	int op;
	string s;
	AFD a;
	init(a);
	f>>op;
	ofstream g("trie.out");
	while(!f.eof())
	{
		f>>s;
		switch(op)
		{
			case 0:
				adaug(a,s);
				break;
			case 1:
				stergere(a,s);
				break;
			case 2:
				g<<aparitii(a,s)<<"\n";
				break;
			case 3:
				g<<prefix(a,s)<<"\n";
				break;
		}
		f>>op;
	}
	f.close();
	g.close();
	return 0;
}