ACM HDOJ 2896 (病毒侵袭)

来源:互联网 发布:网页优化 编辑:程序博客网 时间:2024/04/29 05:37

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2896

import java.util.LinkedList;import java.util.PriorityQueue;import java.util.Queue;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scn = new Scanner(System.in);while (scn.hasNext()) {Trie trie = new Trie();int virusNumber = Integer.parseInt(scn.nextLine());while (0 <= --virusNumber) {trie.insert(scn.nextLine());}trie.build();int count = 0;int websNumber = Integer.parseInt(scn.nextLine());for (int i = 1; i <= websNumber; ++i) {Queue<Integer> queue = trie.search(scn.nextLine());if (!queue.isEmpty()) {System.out.print("web " + i + ":");while (!queue.isEmpty()) {System.out.print(" " + queue.poll());}System.out.println();++count;}}System.out.println("total: " + count);trie = null;}scn.close();}}class Trie {private Node root;private int number;public Trie() {root = new Node(new Node[95], null, 0);number = 0;}public void insert(String str) {Node current = root;for (int i = 0; i < str.length(); ++i) {int index = str.charAt(i) - 32;if (null == current.getChildrenItem(index)) {current.setChildrenItem(index, new Node(new Node[95], null, 0));}current = current.getChildrenItem(index);}current.setNumber(++number);}public void build() {Queue<Node> queue = new LinkedList<Node>();queue.offer(root);while (!queue.isEmpty()) {Node current = queue.poll();for (int i = 0; i < 95; ++i) {if (null != current.getChildrenItem(i)) {if (current == root) {current.getChildrenItem(i).setFail(root);} else {Node fail = current.getFail();while (null != fail) {if (null != fail.getChildrenItem(i)) {current.getChildrenItem(i).setFail(fail.getChildrenItem(i));break;}fail = fail.getFail();}if (null == fail) {current.getChildrenItem(i).setFail(root);}}queue.offer(current.getChildrenItem(i));}}}}public Queue<Integer> search(String str) {Node current = root;Queue<Integer> queue = new PriorityQueue<Integer>();for (int i = 0; i < str.length(); ++i) {int index = str.charAt(i) - 32;while (null == current.getChildrenItem(index) && current != root) {current = current.getFail();}current = current.getChildrenItem(index);if (null == current) {current = root;}Node end = current;while (end != root) {if (0 != end.getNumber()) {if (!queue.contains(end.getNumber())) {queue.add(end.getNumber());if (3 == queue.size()) {return queue;}current = root;break;}}end = end.getFail();}}return queue;}}class Node {private Node[] children;private Node fail;private int number;public Node(Node[] children, Node fail, int number) {this.children = children;this.fail = fail;this.number = number;}public Node getChildrenItem(int i) {return children[i];}public void setChildrenItem(int i, Node node) {children[i] = node;}public Node getFail() {return fail;}public void setFail(Node fail) {this.fail = fail;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}}

0 0
原创粉丝点击