POJ3461 KMP

来源:互联网 发布:曼努埃尔大帝 知乎 编辑:程序博客网 时间:2024/06/09 17:52

T = "ababaaba"的Next数组为 [-1, 0, 1, 2, 3, 1, 2, 3]

再次感悟KMP

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;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) ;void solve(){int t = in.nextInt() ; while(t-- > 0){    out.println(new KMP(in.next().toCharArray()).searchFrom(in.next().toCharArray())) ;    }out.flush() ;}}class KMP {int m;char[] word ;int[] fail;KMP(char[] word) {m = word.length;this.word = word;fail = new int[m + 1];int crt = fail[0] = -1;for (int i = 1; i <= m; i++) {while (crt >= 0 && word[crt] != word[i - 1])crt = fail[crt];fail[i] = ++crt;}}int searchFrom(char[] text) {int n = text.length, count = 0;for (int i = 0, j = 0; i < n; i++) {while (j >= 0 && text[i] != word[j])j = fail[j];if (++j == m) {count++;j = fail[j];}}return count;}}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());}}


0 0
原创粉丝点击