HDU2222 AC自动机

本文介绍了一种使用Aho-Corasick算法处理字符串匹配问题的方法,通过Java实现了一个可以进行多模式字符串搜索的程序。该程序能够高效地在一个文本中查找多个模式串,并返回匹配次数。

图片来自点击打开链接

Sample Input
  
1 5 she he say shr her yasherhs
 

Sample Output
  
3

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
    	new Task().solve() ; 
    }
}

class Task{
	InputReader in = new InputReader(System.in) ;
	PrintWriter out = new PrintWriter(System.out) ;
	
	AhoCorasick ac = new AhoCorasick() ; 
	void solve(){
		int t = in.nextInt() ;
		while(t-- > 0){
			ac.clear() ; 
			int n = in.nextInt() ; 
			while(n-- > 0){
				ac.add(in.next()) ;
			}
			ac.build() ;
			out.println(ac.query(in.next())) ;
		}
		out.flush() ; 
	}
}

class AhoCorasick{
	 final int NODE_SIZE = 500008 ;
	 final int ALPHA_SIZE = 26 ;
	 final int NULL = 0 ; 
	 int[][] next = new int[NODE_SIZE][ALPHA_SIZE] ;
	 int[] fail = new int[NODE_SIZE] ;
	 int[] cnt = new int[NODE_SIZE] ;
	 int root ;
	 int total ;
	 
	 void clear(){
		 total = 0 ;
		 root = newNode() ;
	 }
	 
	 int newNode(){
		 cnt[total] = 0 ;
		 Arrays.fill(next[total] , NULL) ;
		 return total++ ;
	 }
	 
	 void add(String word){
		 int now = root ; 
		 for(char c : word.toCharArray()){
			 int son = c - 'a' ;
			 if(next[now][son] == NULL) next[now][son] = newNode() ;
			 now = next[now][son] ;
		 }
		 cnt[now]++ ;
	 }
	 
	 void build(){
		 Queue<Integer> q = new LinkedList<Integer>() ; 
		 for(int son = 0 ; son < ALPHA_SIZE ; son++){
			 if(next[root][son] == NULL) next[root][son] = root ;
			 else{
				 fail[next[root][son]] = root; 
				 q.add(next[root][son]) ;
			 }
		 }
		 while(! q.isEmpty()){
			 int u = q.poll() ;
			 for(int son = 0 ; son < ALPHA_SIZE ; son++){
				 if(next[u][son] == NULL) next[u][son] = next[fail[u]][son] ;
				 else{
					 fail[next[u][son]] = next[fail[u]][son] ;
					 q.add(next[u][son]) ;		 
				 }
			 }
		 }
	 }
	 
	 int query(String text){
		 int res = 0 ;
		 int now = root ;
		 for(char c : text.toCharArray()){
			 now = next[now][c-'a'] ;
			 int u = now ; 
			 while(u != root && cnt[u] > 0){
				 res += cnt[u] ;
				 cnt[u] = 0 ;
				 u = fail[u] ;
			 }
		 }
		 return res ; 
	 }
}


class InputReader {  
    public BufferedReader reader;  
    public StringTokenizer tokenizer;  
  
    public InputReader(InputStream stream) {  
        reader = new BufferedReader(new InputStreamReader(stream), 32768);  
        tokenizer = new StringTokenizer("");  
    }  
  
    private void eat(String s) {  
        tokenizer = new StringTokenizer(s);  
    }  
  
    public String nextLine() {  
        try {  
            return reader.readLine();  
        } catch (Exception e) {  
            return null;  
        }  
    }  
  
    public boolean hasNext() {  
        while (!tokenizer.hasMoreTokens()) {  
            String s = nextLine();  
            if (s == null)  
                return false;  
            eat(s);  
        }  
        return true;  
    }  
  
    public String next() {  
        hasNext();  
        return tokenizer.nextToken();  
    }  
  
    public int nextInt() {  
        return Integer.parseInt(next());  
    }  
  
    public long nextLong() {  
        return Long.parseLong(next());  
    }  
  
    public double nextDouble() {  
        return Double.parseDouble(next());  
    }  
  
    public BigInteger nextBigInteger() {  
        return new BigInteger(next());  
    }  
  
}  







内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值