Even though the provided string is infinite, the string has a very particular structure. Let's analyze the example, specifically COWWCO to COWWCOOCOWWC. In particular, note that the index 7 maps to index 6, but indices 8 through 12 map to indices 1 through 5.
For notational convenience, let Fk(s)=F(Fk−1(s)), and define F0(s)=s.
We can compute the smallest k such that Fk(s) contains the given index. If k=0, then we are looking at the original string and can therefore return the character directly. Otherwise, take Fk(s) and split it into two halves. The desired index must be in the second half of Fk(s). If it is the first character in the second half, then we want to return the last character in Fk−1(s). Otherwise, due to the rotation, we decrease the index by 1 and return that character in Fk−1(s).
Applying that approach directly gives us an O(log2N) algorithm, which is fast enough for our purposes. It can also be improved to O(logN).
import java.io.*; import java.util.*; public class cowcode { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("cowcode.in")); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("cowcode.out"))); StringTokenizer st = new StringTokenizer(br.readLine()); String s = st.nextToken(); long index = Long.parseLong(st.nextToken()); pw.println(parse(s, index-1)); pw.close(); } public static char parse(String s, long index) { if(index < s.length()) { return s.charAt((int)index); } long length = s.length(); while(2*length <= index) { length *= 2; } if(length == index) { return parse(s, length-1); } return parse(s, index - length - 1); } }