/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package year_2012.qualification;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Set;

/**
 *
 * @author paul
 * @date 14 Apr 2012
 */
public class QuestionC {

    private static Set<Integer> getCycle(int x) {

        String s = Integer.toString(x);
        Set<Integer> set = new HashSet<Integer>();
        set.add(x);
        for (int c = 1; c < s.length(); c++) {
            String t = s.substring(c).concat(s.substring(0, c));
            set.add(Integer.parseInt(t));
        }
        return set;
        
    }

    private static Set<Integer> mask(Set<Integer> set, int a, int b) {
        Set<Integer> result = new HashSet<Integer>();

        for (int x : set) {
            if (x >= a && x <= b) {
                result.add(x);
            }
        }
        
        return result;

    }


    public static void main(String[] args) throws FileNotFoundException, IOException {

        String question = "C";

//        String name = "large";
        String name = "small-attempt0";
//        String name = "test";

        String filename = String.format("%s-%s", question, name);

        BufferedReader input = new BufferedReader(
                new FileReader(String.format("/home/paul/Documents/code-jam/2012/qualification/%s.in",
                filename)));

        String firstLine = input.readLine();

        PrintWriter pw = new PrintWriter(new File(
                String.format("/home/paul/Documents/code-jam/2012/qualification/%s.out", filename)));


        int T = Integer.parseInt(firstLine);

        // Loop through test cases.
        for (int i = 0; i < T; i++) {

//             Read data.
            String[] tokens = input.readLine().split(" ");

//            int N = Integer.parseInt(input.readLine());

            int A = Integer.parseInt(tokens[0]);
            int B = Integer.parseInt(tokens[1]);

//            System.out.format("%d, %d\n", A, B);

            boolean[] used = new boolean[B+1];
            int total = 0;
            for (int n = A; n <= B; n++) {
                if (!used[n]) {
                    Set<Integer> set = mask(getCycle(n), A, B);
                    int k = set.size();
                    total += (k * (k-1))/2;
                    for (int m : set) {
                        used[m] = true;
                    }
                }
            }

            pw.format("Case #%d: %d\n", i + 1, total);
        }

        pw.close();

    }

}

package org.ryan.jam;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * user: ryan.moore
 * date: 4/14/12
 */
public class CodeJamUtil {

    public static List<String> parseInputToList(String inputString) {

        String numLines = inputString.substring(0, inputString.indexOf("\n"));

        String remainingString = inputString.substring(inputString.indexOf("\n")+1);

        List<String> linesList = new ArrayList<String>();

        for (int i = 0; i < Integer.valueOf(numLines); i++) {
            if (i < Integer.valueOf(numLines) -1) {
                linesList.add(remainingString.substring(0, remainingString.indexOf("\n") + 1).trim());
                remainingString = remainingString.substring(remainingString.indexOf("\n")+1);
            } else {
                linesList.add(remainingString);
            }
        }

        return linesList;
    }

    public static List<Integer> getDistinctRecycledPairs(List<String> linesList) {

        //each iteration is a testcase
        List<Integer> resultMatchesList = new ArrayList<Integer>();
        for (String line : linesList) {

            Integer numberA = Integer.valueOf(line.substring(0, line.indexOf(" ")));
            Integer numberB = Integer.valueOf(line.substring(line.indexOf(" ") + 1).trim());

            Integer numberMatches = 0;

            for(int i=numberA; i<numberB - 1; i++) {

                for(int j=numberA + 1; j<=numberB; j++) {

                    //ok now we're iterating correctly, lets call a method to get permutations + check matches
                    Integer result = permuteAndCompare(i,j);
                    numberMatches = numberMatches + result;
                }

                numberA++;
            }
            resultMatchesList.add(numberMatches);
        }

        return resultMatchesList;
    }

    public static String readFileAsString(String filePath) throws java.io.IOException {

        StringBuffer fileData = new StringBuffer(1000);
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){

            fileData.append(buf, 0, numRead);
        }
        reader.close();
        return fileData.toString();
    }

    private static Integer permuteAndCompare(Integer numberA, Integer numberB) {

        int numberMatches = 0;

        List<Integer> validPermutes = getValidRecycledPermutations(numberB);

        for (Integer current : validPermutes) {
            if(current.equals(numberA)) {
                numberMatches++;

                System.out.println("Found match = "+ numberA + " and " + current);
            }
        }

        return numberMatches;
    }

    private static List<Integer> getValidRecycledPermutations(Integer number) {

        String numberString = Integer.toString(number);

        Integer numDigits = numberString.length();

        List<Integer> resultList= new ArrayList<Integer>();
        for (int i =numDigits-1; i>0; i-- ) {

            char ch4r = numberString.charAt(i);
            if (!(ch4r == '0')) {

                String concatStringResult = numberString.substring(i, numDigits) + numberString.substring(0, i);
                Integer result = Integer.valueOf(concatStringResult.trim());
                resultList.add(result);
            } //else dont do anything

        }

        return resultList;
    }
}
