2010年10月1日金曜日

PKU Judge Online 1731 Orders

■1731 Orders

□Problem
文字列sが与えられる.sの順列を辞書式順で生成せよ.但し,重複する文字列は省く.

□Solution
順列生成は再帰で.
重複を省くためには,以下.
まず,
s=c0c1…cn-1
に,
vk=kと数字を割り当てる.
再帰で順列を生成し,
s'=ca0ca1…can-1
となったとする.
cai=caj (i<j)
となるi,jがあった時,
vi<vj
であれば,その順列を出力し,そうでない場合は出力しない.
実際には,この判定を再帰の途中で行い,枝刈りをしている.

出力が遅かったため(TLEした),
System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
として,最後にまとめてストリームをフラッシュ.

□Code
  1. package p1731;  
  2.   
  3. import java.util.*;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.PrintStream;  
  6. import java.lang.*;  
  7. import java.math.*;  
  8.   
  9. // AC  
  10. public class Main{  
  11.  Scanner sc=new Scanner(System.in);  
  12.   
  13.  char[] cs;  
  14.  int[] order;  
  15.  int n;  
  16.   
  17.  void recursive(int j){  
  18.   if(j==n){  
  19.    println(new String(cs));  
  20.    return;  
  21.   }  
  22.   for(int i=j; i<n; i++){  
  23.    // right rotate [j,i]  
  24.    char c=cs[i];  
  25.    int t=order[i];  
  26.    for(int k=i; k>j; k--){  
  27.     cs[k]=cs[k-1];  
  28.     order[k]=order[k-1];  
  29.    }  
  30.    cs[j]=c;  
  31.    order[j]=t;  
  32.    boolean f=true;  
  33.    for(int k=j; k<=i; k++){  
  34.     if(cs[j]==cs[k]&&order[j]>order[k]){  
  35.      f=false;  
  36.      break;  
  37.     }  
  38.    }  
  39.    if(f)  
  40.     recursive(j+1);  
  41.    // left rotate [j,i]  
  42.    for(int k=j; k<i; k++){  
  43.     cs[k]=cs[k+1];  
  44.     order[k]=order[k+1];  
  45.    }  
  46.    cs[i]=c;  
  47.    order[i]=t;  
  48.   }  
  49.  }  
  50.   
  51.  void run(){  
  52.   cs=sc.next().toCharArray();  
  53.   n=cs.length;  
  54.   order=new int[n];  
  55.   for(int i=0; i<n; i++)  
  56.    order[i]=i;  
  57.   Arrays.sort(cs);  
  58.   recursive(0);  
  59.   System.out.flush();  
  60.  }  
  61.   
  62.  void println(String s){  
  63.   System.out.println(s);  
  64.  }  
  65.   
  66.  void print(String s){  
  67.   System.out.print(s);  
  68.  }  
  69.   
  70.  public static void main(String[] args){  
  71.   System.setOut(new PrintStream(new BufferedOutputStream(System.out)));  
  72.   new Main().run();  
  73.  }  
  74. }  

0 件のコメント: