2011年4月3日日曜日

Aizu Online Judge 1203 Napoleon's Grumble

■1203 Napoleon's Grumble

回文の中心点jを0~n-1まで動かしながら,
cj-i,…,cj+i
cj-i,…,cj+i+1
が回文となる最大のiを探す.
片っ端から回文候補をリストに入れた後,冗長のものを省く.
  1. import java.util.*;  
  2. import java.lang.*;  
  3. import java.math.*;  
  4. import java.io.*;  
  5.   
  6. import static java.lang.Math.*;  
  7. import static java.util.Arrays.*;  
  8.   
  9. public class Main{  
  10.   
  11.  Scanner sc=new Scanner(System.in);  
  12.   
  13.  int INF=1<<28;  
  14.  double EPS=1e-9;  
  15.   
  16.  String s;  
  17.   
  18.  void run(){  
  19.   for(; sc.hasNextLine();){  
  20.    s=sc.nextLine();  
  21.    solve();  
  22.   }  
  23.  }  
  24.   
  25.  void solve(){  
  26.   s=s.toUpperCase().replaceAll("[^A-Z]""");  
  27.   int n=s.length();  
  28.   TreeSet<String> set=new TreeSet<String>();  
  29.   for(int j=0; j<n; j++){  
  30.    int i;  
  31.    for(i=0; j-i>=0&&j+i<n&&s.charAt(j-i)==s.charAt(j+i); i++);  
  32.    i--;  
  33.    if(i>=1){  
  34.     set.add(s.substring(j-i, j+i+1));  
  35.    }  
  36.    for(i=0; j-i>=0&&j+i+1<n&&s.charAt(j-i)==s.charAt(j+i+1); i++);  
  37.    i--;  
  38.    if(i>=1){  
  39.     set.add(s.substring(j-i, j+i+2));  
  40.    }  
  41.   }  
  42.   for(Iterator<String> i=set.iterator(); i.hasNext();){  
  43.    String s=i.next();  
  44.    for(Iterator<String> j=set.iterator(); j.hasNext();){  
  45.     String t=j.next();  
  46.     if((s.length()+t.length())%2==0&&t.length()>s.length()){  
  47.      int k=(t.length()-s.length())/2;  
  48.      if(t.substring(k, t.length()-k).equals(s)){  
  49.       i.remove();  
  50.       break;  
  51.      }  
  52.     }  
  53.    }  
  54.   }  
  55.   for(; !set.isEmpty();){  
  56.    print(set.pollFirst());  
  57.    if(!set.isEmpty()){  
  58.     print(" ");  
  59.    }  
  60.   }  
  61.   println("");  
  62.  }  
  63.   
  64.  void debug(Object... os){  
  65.   System.err.println(Arrays.deepToString(os));  
  66.  }  
  67.   
  68.  void print(String s){  
  69.   System.out.print(s);  
  70.  }  
  71.   
  72.  void println(String s){  
  73.   System.out.println(s);  
  74.  }  
  75.   
  76.  public static void main(String[] args){  
  77.   // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));  
  78.   new Main().run();  
  79.  }  
  80. }  

0 件のコメント: