Cod sursa(job #1507222)

Utilizator kindjozsefKind Jozsef kindjozsef Data 21 octombrie 2015 15:54:16
Problema Aho-Corasick Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 4.13 kb
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;


public class Trie 
{
	private Trie parent;
	private ArrayList<Trie> children;
	private ArrayList<Integer> out;
	private char preLabel;
	private Trie fail;
		
	public Trie(Trie parent,char preLabel)
	{
		this.parent = parent;
		children = new ArrayList<Trie>();
		out = new ArrayList<Integer>();
		this.preLabel = preLabel;
		fail = null;
	}
	
	public Trie gt(char label)
	{
		for(Trie t : children)
		{
			if(t.getPreLabel() == label)
			{
				return t;
			}
		}
		return (parent == null) ? this : null;
	}
	
	public char getPreLabel()
	{
		return this.preLabel;
	}
	
	public void addWord(String word, int nr)
	{
		if(word.length() == 1)
		{
			Trie t = gt(word.charAt(0));
			if(t == null || t == this)
			{
				t = new Trie(this,word.charAt(0));
				t.out.add(nr);
				children.add(t);
			}
			else
			{
				t.out.add(nr);
			}
		}
		else
		{
			Trie t = gt(word.charAt(0));
			if(t == null || t == this)
			{
				t = new Trie(this,word.charAt(0));
				t.addWord(word.substring(1),nr);
				children.add(t);
			}
			else
			{
				t.addWord(word.substring(1),nr);
			}
		}
	}

	public void phase2()
	{
		Queue<Trie> queue = new LinkedList<Trie>();
		for(char i = 'a'; i <= 'z';++i)
		{
			Trie temp = gt(i);
			if(temp != this && temp != null)
			{
				temp.setFail(this);
				queue.add(temp);
			}
		}
		Trie r;
		Trie u;
		Trie v;
		while((r = queue.poll()) != null)
		{
			for(char i = 'a'; i <= 'z';++i)
			{
				u = r.gt(i);
				if(u != null)
				{
					queue.add(u);
					v = r.getFail();
					while(v.gt(i) == null)
					{
						v = v.getFail();
					}
					u.setFail(v.gt(i));
					for(Integer ii : u.getFail().out)
					{
						u.out.add(ii);
					}
				}
			}
		}
		
	}
	
	public static void main(String [] args)
	{
		String [] words = null;
		String text = null;
		int n = 0;
		int [] count = null;
		File file = new File("ahocorasick.in");
		BufferedReader in = null;
		FileReader fReader = null;
		try 
		{
			fReader = new FileReader(file);
			in = new BufferedReader(fReader);
			text = in.readLine();
			n = Integer.parseInt(in.readLine());
			words = new String[n];
			count = new int[n];
			for(int i = 0; i < n;++i)
			{
				words[i] = in.readLine();
				count[i] = 0;
			}
		} 
		catch (FileNotFoundException ex1) 
		{
			ex1.printStackTrace();
		}
		catch (IOException ex2)
		{
			ex2.printStackTrace();
		}
		finally
		{
			if(fReader != null)
			{
				try
				{
					fReader.close();
				} 
				catch (IOException e){}
			}
			if(in != null)
			{
				try
				{
					in.close();
				}
				catch(IOException e){}
			}
		}
	
		Trie t = new Trie(null,'%');
		
		for(int i = 0; i < n;++i)
		{
			t.addWord(words[i], i);
		}
		
		t.phase2();
		
		for(int i = 0; i < text.length();++i)
		{
			char a = text.charAt(i);
			while(t.gt(a) == null)
			{
				t = t.getFail();
			}
			t = t.gt(a);
			for(Integer ii : t.out)
			{
				++count[ii];
			}
		}
		t.writeToFile(count,n);
	}
	
	public void setFail(Trie fail)
	{
		this.fail = fail;
	}
	
	public Trie getFail()
	{
		return this.fail;
	}
	
	public void writeToFile(int [] count, int n)
	{
		PrintWriter out = null;
		BufferedWriter bWriter = null;
		FileWriter fw = null;
		try
		{
			fw = new FileWriter("ahocorasick.out",true);
			bWriter = new BufferedWriter(fw);
			out = new PrintWriter(bWriter);
			for(int i = 0; i < n;++i)
			{
				out.println(count[i]);
			}
		}
		catch(IOException ex1)
		{
			ex1.printStackTrace();
		}
		finally
		{
			if(out != null)
			{
				out.close();
			}
			if(fw != null)
			{
				try 
				{
					fw.close();
				} 
				catch (IOException e){}
			}
			if(bWriter != null)
			{
				try
				{
					bWriter.close();
				}
				catch(IOException e){}
			}
			
		}
	}

}