Submission #330550

#TimeUsernameProblemLanguageResultExecution timeMemory
330550KWang31Longest beautiful sequence (IZhO17_subsequence)Java
23 / 100
456 ms17380 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<<8;

    public static void main(String[] args){

        FastReader br=new FastReader();

        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();
        if(N<5000) {
        	int[] dp=new int[N]; Arrays.fill(dp, 1);
        	int[] child=new int[N];//Tracks the previous term of the sequence
        	Arrays.fill(child,-1);
        	for(int i=1;i<N;i++) {
        		for(int j=0;j<i;j++) {
        			if(Integer.bitCount(a[i]&a[j])==k[i]) {
        				if(1+dp[j]>dp[i]) {
        					dp[i]=dp[j]+1; child[i]=j;
        				}
        			}
        		}
        	}
        	
        	int max=0; int ind=-1;
        	for(int i=0;i<N;i++) {
        		if(dp[i]>max) {
        			max=dp[i]; ind=i;
        		}
        	}
        	
        	ArrayList<Integer> arl=new ArrayList<>();
        	while(ind >= 0) {
        		arl.add(ind);
        		
        		ind=child[ind];
        	}
        	System.out.println(max);
        	StringBuilder sb=new StringBuilder();
        	for(int i=arl.size()-1; i>=0; i--) {
        		sb.append(arl.get(i)+1).append(" ");
        	}
        	System.out.println(sb.toString());
        }else {
        	int[] dp=new int[MAX];
        	int[] map=new int[MAX];
        	int[] child=new int[N]; Arrays.fill(child,-1);
        	for(int i=0;i<N;i++) {
        		map[a[i]]=i;
        		for(int j=0;j<MAX;j++) {
        			if(Integer.bitCount(a[i]&j)!=k[i])continue;
        			if(dp[j]+1>dp[a[i]]) {
        				dp[a[i]]=dp[j]+1; child[i]=map[j];
        			}
        		}
        	}
        	int ind=0; int max=0;
        	for(int i=0;i<MAX;i++) {
        		if(dp[i]>max) {
        			max=dp[i]; ind=map[i];
        		}
        	}
        	ArrayList<Integer> arl=new ArrayList<>();
        	while(ind >= 0) {
        		arl.add(ind);
        		
        		ind=child[ind];
        	}
        	System.out.println(max);
        	StringBuilder sb=new StringBuilder();
        	for(int i=arl.size()-1; i>=0; i--) {
        		sb.append(arl.get(i)+1).append(" ");
        	}
        	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...