poj 3274 Gold Balanced Lineup

稍微有點難想。。。用一個數組向量來表示當前的狀態,向量可以化簡比如 222其實就是000

然後如果兩個向量相等,那麼兩個向量之間的feature是一樣多的

寫了一個巨慢的哈希數組跑了7秒

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

class problem2{
    int n,k;
    int arr[];
    int table[][];
    String hash[];
    int pos[];
    int result = 0;
    void solver() throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        
        StringTokenizer st = new StringTokenizer(reader.readLine());
        n = Integer.valueOf(st.nextToken());
        k = Integer.valueOf(st.nextToken());
        arr = new int[n+1];
        hash = new String[n+1];
        pos = new int[n+1];
        for(int i=1;i<=n;i++){
            arr[i] = Integer.valueOf(reader.readLine());
        }
        table = new int[n+1][k];
        hash(table[0],0);
        for(int i=1;i<=n;i++){
            int min = 99999;
            for(int j=k-1;j>=0;j--){
                table[i][j]=table[i-1][j];
                if((arr[i]&(1<<(k-1-j)))>0) table[i][j]+=1;
                if(table[i][j]<min) min = table[i][j];
            }
            if(min>0){
                for(int j=k-1;j>=0;j--)
                    table[i][j]-=min;
            }
            int tmp = hash(table[i],i);
            if(tmp>result) result=tmp;
        }
        //Dumper.print_2_arr(table, n, k);
        System.out.println(result);
    }
    int hash(int arr[], int p){
        String t = "";
        for(int i=0;i<arr.length;i++){
            t+=arr[i];
        }
        int index = t.hashCode();
        if(index<0) index = 0-index;
        index%=n;
        while(hash[index]!=null){
            if(t.equals(hash[index])) return p-pos[index];
            else if(index==hash.length-1) index=0;
            else index++;
        }
        hash[index]=t;
        pos[index]=p;
        return -1;
    }
}
public class Main{
    public static void main (String [] args) throws Exception {
        problem2 p = new problem2();
        p.solver();
    }
}


發佈了245 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章