您的位置:首页 > 其它

POJ3461KMP

2015-06-28 20:36 218 查看
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

public static void main(String[] args) {
InputReader in = new InputReader(System.in) ;
PrintWriter out = new PrintWriter(System.out);

int t = in.nextInt() ;
while((t--) > 0){
out.println( new KMP(in.next().toCharArray()).searchForm(in.next().toCharArray()) ) ;
}

out.flush() ;
}

}

class KMP{
int m ;
char[] p ;
int[] fail ;

KMP(char[] p){
m = p.length ;
this.p = p ;
fail = new int[m+1] ;
int crt = fail[0] = -1 ;
for(int i = 1 ; i <= m ; i++){
while(crt >= 0 && p[crt] != p[i-1]) crt = fail[crt] ;
fail[i] = ++ crt ;
}

}

int searchForm(char[] txt){
int n = txt.length , count = 0 ;
for(int i = 0 , j = 0 ; i < n ; i++){
while(j >= 0 && txt[i] != p[j]) j = fail[j] ;
if(++j == m){
count++ ;
j = fail[j] ;
//j = 0 ;
}
}
return  count ;
}
}

class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;

public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}

public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}

public int nextInt() {
return Integer.parseInt(next());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: