Submission #336568

#TimeUsernameProblemLanguageResultExecution timeMemory
336568KWang31Longest beautiful sequence (IZhO17_subsequence)Java
0 / 100
538 ms174824 KiB
import java.io.*; import java.util.*;

public class subsequence{

  static class FastReader 

    { 

        BufferedReader br; 

        StringTokenizer st; 

  

        public FastReader() 

        { 

            br = new BufferedReader(new

                     InputStreamReader(System.in)); 

        } 

  

        String next() 

        { 

            while (st == null || !st.hasMoreElements()) 

            { 

                try

                { 

                    st = new StringTokenizer(br.readLine()); 

                } 

                catch (IOException  e) 

                { 

                    e.printStackTrace(); 

                } 

            } 

            return st.nextToken(); 

        } 

  

        int nextInt() 

        { 

            return Integer.parseInt(next()); 

        } 

  

        

    } 

    static int MOD=998244353;

    static int MAX=1<<10;

    public static void main(String[] args){

        FastReader br=new FastReader();
        int[] btcnt=new int[MAX]; for(int i=0;i<MAX;i++) {btcnt[i]=Integer.bitCount(i);}
        
        int[][][] M=new int[MAX][MAX][11];
        int[][][] ind=new int[MAX][MAX][11];
        
        int N=br.nextInt(); int[] a=new int[N]; int[] k=new int[N];
        for(int i=0;i<N;i++) {a[i]=br.nextInt();}
        for(int i=0;i<N;i++) {k[i]=br.nextInt();}
        int q=0; int r=a[0]&(MAX-1); int z; int[] prev=new int[N]; 
        Arrays.fill(prev, -1);
        int[] ans=new int[N];
        ans[0]=1;
        for(int j=0;j<MAX;j++) {
    		
    		M[j][r][btcnt[j&r]]++; ind[j][r][btcnt[j&r]]=0;
    		
    	}
        for(int i=1;i<N;i++) {
        	q=a[i]>>>10; r=a[i]&(MAX-1); 
        	for(int j=0;j<MAX;j++) {//QUERY
        		z=k[i]-btcnt[r&j];
        		if(z>=0 && z<=10) { //The first 10 bits have EXACTLY z bits in common
        			if( M[q][j][z]+1>ans[i]) {
        				
        				ans[i]=M[q][j][z]+1; prev[i]=ind[q][j][z];
        			}
        		}
        	}
        	//UPDATE
        	for(int j=0;j<MAX;j++) {
        		if(M[j][r][btcnt[j&r]]<ans[i]) {
        			M[j][r][btcnt[j&r]]=ans[i]; ind[j][r][btcnt[j&r]]=i;
        		}
        	}
        }
        int mx=0; int cur=-1;
        for(int i=0;i<N;i++) {
        	if(ans[i]>mx) {
        		mx=ans[i]; cur=i;
        	}
        }
        
        System.out.println(mx);
        ArrayList<Integer> arl=new ArrayList<>();
        arl.add(cur+1);
        while(cur>0) {
        	cur=prev[cur]; arl.add(cur+1);
        }
        StringBuilder sb=new StringBuilder();
        for(int i=mx-1;i>=0;i--) {
        	sb.append(arl.get(i)+" ");
        }
        System.out.println(sb.toString());
    }


}

//Debugging:

//Are you sure your algorithm is correct?

//Bounds: long

//Special cases: n=0,1?

//Make sure you remove your debugging code before you submit!
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...