http://poj.org/problem?id=1366 //* @author: <strong>Yeming Hu</strong>"cslittleye@gmail.com" import java.util.*; import java.io.*; public class Main { public static BufferedInputStream bis; public static StringBuilder str; public static char[][] rules; public static StringBuilder[] words; public static int k; public static void main(String[] args) throws Exception { bis = new BufferedInputStream(System.in); rules = new char[8][4]; Map< String,Boolean> exist = new HashMap< String,Boolean>(); words = new StringBuilder[40000]; StringBuilder start,result, previous, key; str = new StringBuilder(); start = new StringBuilder(); result = new StringBuilder(); previous = new StringBuilder(); key = new StringBuilder(); for(int i = 0; i < 40000; i++) { words[i] = new StringBuilder(); } while(true) { int n = (int)readLong(); if(n == -1) { break; } k = 0; start.delete(0,start.length()); start.append(readString()); readRules(); long s = readLong(); result.delete(0,result.length()); result.append(start); exist.clear(); words[k].delete(0,words[k].length()); words[k].append(lowest(result)); k++; for(int j=0;j< s;j++) { previous.delete(0,previous.length()); previous.append(result); result.delete(0,result.length()); for(int i=0;i< n;i++) { int i1 = (i-2+n)%n; int i2 = i; int i3 = (i+1)%n; key.delete(0,key.length()); key.append(previous.charAt(i1)); key.append(previous.charAt(i2)); key.append(previous.charAt(i3)); result.append(getKey(key)); } String lw = lowest(result); if(exist.get(lw) == null) { exist.put(lw,true); words[k].delete(0,words[k].length()); words[k].append(lw); k++; }else { int index = find(lw); int p = j + 1 - index; long resultIndex = ((s - j) % p - 1 + p)%p + index; result.delete(0,result.length()); result.append(words[(int)resultIndex]); break; } } System.out.println(lowest(result)); } } public static int find(String lw) { int index = 0; for(int i = 0; i < k; i++) { boolean reached = true; for(int j = 0; j < lw.length(); j++) { if(lw.charAt(j) != words[i].charAt(j)) { reached = false; break; } } if(reached) { index = i; break; } } return index; } public static char getKey(StringBuilder sb) { char result = ''; for(int i = 0; i < 8; i++) { boolean reached = true; for(int j = 0; j < 3; j++) { if(rules[i][j] != sb.charAt(j)) { reached = false; break; } } if(reached) { result = rules[i][3]; break; } } return result; } public static void readRules() throws Exception { for(int i = 0; i < 8; i++) { for(int j = 0; j < 4; j++) { while(true) { int bt = bis.read(); if(Character.isLetter(bt)) { rules[i][j] = (char)bt; break; } } } } } static String lowest(StringBuilder sb) { String p = sb.toString(); String min = p; int n = p.length(); for(int i=0;i< n;i++) { String next = p.substring(n-1,n) + p.substring(0,n-1); if(next.compareTo(min) < 0) { min = next; } p = next; } return min; } public static long readLong() throws Exception { long num = 0; while(true) { int bt = bis.read(); if(bt == -1) { return -1; } if(Character.isDigit(bt)) { num = num*10 + bt - '0'; break; } } while(true) { int bt = bis.read(); if(!Character.isDigit(bt)) { break; } num = num*10 + bt - '0'; } return num; } public static StringBuilder readString() throws Exception { str.delete(0,str.length()); while(true) { int bt = bis.read(); if(Character.isLetter(bt)) { str.append((char)bt); break; } } while(true) { int bt = bis.read(); if(!Character.isLetter(bt)) { break; } str.append((char)bt); } return str; } }
Meta
-
Recent Posts
Recent Comments
Archives
- May 2024
- April 2023
- February 2023
- January 2023
- December 2022
- November 2022
- September 2022
- June 2022
- July 2021
- January 2021
- February 2020
- September 2019
- March 2018
- February 2018
- August 2016
- July 2016
- June 2016
- May 2016
- April 2016
- March 2016
- February 2016
- January 2016
- December 2015
- November 2015
- October 2015
- September 2015
- August 2015
- July 2015
- June 2015
- May 2015
- April 2015
- March 2015
- February 2015
- January 2015
- December 2014
- November 2014
- October 2014
- September 2014
- August 2014
- July 2014
- June 2014
- May 2014
- April 2014
- March 2014
- February 2014
- January 2014
- December 2013
- November 2013
- October 2013
- September 2013
- August 2013
- July 2013
- June 2013
- May 2013
- April 2013
- March 2013
- February 2013
- January 2013
- December 2012
- November 2012
- October 2012
- September 2012
- August 2012
- July 2012
- June 2012
- May 2012
- April 2012
- March 2012
- February 2012
- January 2012
- December 2011
- November 2011
- October 2011
- September 2011
- August 2011
- July 2011
- June 2011
- May 2011
- April 2011
- March 2011
- February 2011
- January 2011
- December 2010
- November 2010
- October 2010
- September 2010
- August 2010
- July 2010
- June 2010
- May 2010
- April 2010
- March 2010
- February 2010
- January 2010
- December 2009
- November 2009
- October 2009
- September 2009
- August 2009
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
Categories