自己的AC自动机代码模板(很牛比的算法):
class Node{
Node[] childs;
Node fail;
int sum;
public Node() {
sum=0;
childs=new Node[26];
}
}
public class Main {
public Node insert(Node root,String s){
Node temp=root;
root.sum++;
for(int i=0;i<s.length();i++){
int index=s.charAt(i)-'a';
if(temp.childs[index]==null){
temp.childs[index]=new Node();
}
temp=temp.childs[index];
temp.fail=root;
}
temp.sum++;
return root;
}
public void getFail(Node root){
Queue<Node> queue=new LinkedList<Node>();
queue.add(root);
while(!queue.isEmpty()){
Node node=queue.poll();
for(int i=0;i<26;i++){
if(node.childs[i]!=null){
Node temp=node.fail;
while(temp!=null){
if(temp.childs[i]!=null){
node.childs[i].fail=temp.childs[i];
break;
}
temp=temp.fail;
}
if(temp==null) node.childs[i].fail=root;
queue.add(node.childs[i]);
}
}
}
}
public int query(String s,Node root){
Node temp=root;
int res=0;
for(int i=0;i<s.length();i++){
int index=s.charAt(i)-'a';
while(temp!=null&&temp.childs[index]==null) temp=temp.fail;
if(temp==null) temp=root;
else temp=temp.childs[index];
Node p=temp;
while(p!=root&&p.sum!=0){
res+=p.sum;
p.sum=0;
p=p.fail;
}
}
return res;
}
}