稍微有點難想。。。用一個數組向量來表示當前的狀態,向量可以化簡比如 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();
}
}