AC自动机算法JAVA

来源:互联网 发布:电脑桌面的便签软件 编辑:程序博客网 时间:2024/06/05 06:56

AC算法

fail指针

字典树

import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class Didi {    private static Node root=new Node();    private static Queue<Node> queue=new LinkedList<Node>();    public static void main(String[] args) {        Scanner input=new Scanner(System.in);        String[] word={"say","she","shr","he","her"};        String s="yasherhs";        for (int i = 0; i < word.length; i++) {            insert(word[i]);        }        build_ac_automation(root);        System.out.println(query(s));    }    public static int query(String s){        int count=0;        Node p=root;        char[] str=s.toCharArray();        for (int i = 0; i < str.length; i++) {            int index=str[i]-'a';            while(p.child[index]==null&&p!=root){                p=p.fail;            }            p=p.child[index];            p=(p==null)?root:p;            Node temp=p;            while(temp!=root&&temp.count!=-1){                count+=temp.count;                temp.count=-1;                temp=temp.fail;            }        }        return count;    }    public static void build_ac_automation(Node root){        root.fail=null;        queue.add(root);        while(!queue.isEmpty()){            Node temp=queue.poll();            Node p=null;            for (int i = 0; i < 26; i++) {                if(temp.child[i]!=null){                    if(temp==root){                        temp.child[i].fail=root;                    }else{                        p=temp.fail;                        while(p!=null){                            if(p.child[i]!=null){                                temp.child[i].fail=p.child[i];                                break;                            }                            p=p.fail;                        }                        if(p==null){                            temp.child[i].fail=root;                        }                    }                    queue.add(temp.child[i]);                   }            }        }    }    public static void insert(String str){        if(str.isEmpty()||str==""){            return;        }        Node cnode=root;        for (int i = 0; i < str.length(); i++) {            int index=str.charAt(i)-'a';            if(cnode.child[index]==null){                Node pnode=new Node();                cnode.child[index]=pnode;            }            cnode=cnode.child[index];        }        cnode.count=1;    }}class Node{    int count;    Node fail;    Node[] child;    public Node(){        fail=null;        count=0;        child=new Node[26];    }}
0 0