poj 1625 (AC自动机 + dp + 高精度(java) )

RE 了n久,没想到最后是因为死在了编码上


import java.util.*;
import java.math.*;
import java.io.*;

public class Main {
        final static int NODE = 105;
        final static BigInteger ZERO = BigInteger.ZERO, ONE = BigInteger.ONE;
        static int code[] = new int[256], chd[][] = new int[NODE][55];
        static int val[] = new int[NODE], sz = 1, fail[] = new int[NODE];
        
        public static void insert (String s){
                int p = 0;
                for (int i = 0; i < s.length(); i ++){
                        int xx = s.charAt(i);
                        int c = code[xx];
                        if (chd[p][c] == 0){
                                chd[p][c] = sz ++;
                        }
                        p = chd[p][c];
                }
                val[p] = 1;
        }
        
        public static void getfail (final int CHD){
                Queue<Integer> q = new LinkedList<Integer>();
                for (int i = 0; i < CHD; i ++){
                        fail[chd[0][i]] = 0;
                        if (chd[0][i] > 0){
                                q.add(chd[0][i]);
                        }
                }
                while (!q.isEmpty()){
                        int t = q.remove();
                        for (int i = 0; i < CHD; i ++){
                                if (chd[t][i] > 0){
                                        q.add(chd[t][i]);
                                        fail[chd[t][i]] = chd[fail[t]][i];
                                        val[chd[t][i]] += val[chd[fail[t]][i]];
                                }else{
                                        chd[t][i] = chd[fail[t]][i];
                                }
                        }
                }
        }
        
        public static void main (String args[])throws Exception{
                int n, m, p;
                Scanner cin = new Scanner(new BufferedInputStream(System.in), "ISO-8859-1");
                n = cin.nextInt();
                m = cin.nextInt();
                p = cin.nextInt();
                String ss = cin.nextLine();
                ss = cin.nextLine();
                for (int i = 0; i < ss.length(); i ++){
                        int c = ss.charAt(i);
                        code[c] = i;
                }
                for (int i = 0; i < p; i ++){
                        String s = cin.nextLine();
                        insert (s);
                }
                getfail (n);
                BigInteger dp[][] = new BigInteger[55][105];
                for (int i = 0; i < 55; i ++){
                        for (int j = 0; j < 105; j ++){
                                dp[i][j] = ZERO;
                        }
                }
                int CHD = n;
                dp[0][0] = ONE;
                for (int i = 0; i < m; i ++){
                        for (int j = 0; j < sz; j ++){
                                if (val[j] == 0){
                                        for (int h = 0; h < CHD; h ++){
                                                int v = chd[j][h];
                                                if (val[v] == 0){
                                                        dp[i+1][v] = dp[i+1][v].add(dp[i][j]);
                                                }
                                        }
                                }
                        }
                }
                BigInteger ans = ZERO;
                for (int i = 0; i < sz; i ++){
                        ans = ans.add(dp[m][i]);
                }
                System.out.println (ans);
        }
}


你可能感兴趣的:(poj 1625 (AC自动机 + dp + 高精度(java) ))