Pagini recente » Cod sursa (job #195602) | Cod sursa (job #2283812) | Cod sursa (job #2871291) | Cod sursa (job #1466586) | Cod sursa (job #1507222)
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){}
}
}
}
}