Submission #29930553
Source Code Expand
// D - ABC Transform
// https://atcoder.jp/contests/abc242/tasks/abc242_d
// 実行制限時間: 2.0 sec
import Foundation
func main() {
// =====================
// actual code goes here
// =====================
let S = readChars()
let abc: [Character] = ["A", "B", "C"]
func encode(_ c: Character) -> Int {
return abc.firstIndex(of: c)!
}
func getPrevious(t: Int, k: Int) -> Int {
guard t > 0 else {
return encode(S[k])
}
guard k > 0 else {
return (encode(S[k]) + t) % 3
}
var previous = getPrevious(t: t - 1, k: k / 2)
if k % 2 == 0 {
previous += 1
} else {
previous += 2
}
return previous % 3
}
let Q = readInt()
for _ in 1...Q {
let (t, k) = readInts().tupled()
print(abc[getPrevious(t: t, k: k-1)])
}
// ===============
// actual code end
// ===============
}
main()
func readString () -> String { readLine()! }
func readChars () -> [Character] { Array(readString()) }
func readSubsequence () -> [String.SubSequence] { readString().split(separator: " ")}
func readStrings () -> [String] { readSubsequence().map({String($0)}) }
func readInt() -> Int { Int(readString())! }
func readInts() -> [Int] { readSubsequence().map{Int(String($0))!} } // TODO: remove the String conversion once AtCoder is updated to 5.5
// =========
// Operators
// =========
infix operator /-: MultiplicationPrecedence // FloorDiv
/// FloorDiv
/// - Returns: Division result floored towards negative infinity
func /- (lhs: Int, rhs: Int) -> Int {
if rhs < 0 { return -lhs /- -rhs }
return lhs >= 0 ? lhs / rhs : (lhs - rhs + 1) / rhs }
// ==========
// Extentions
// ==========
extension Bool {
/// Returns String "Yes" or "No" depending on the bool value
var yN: String { self ? "Yes" : "No" } }
extension Array {
func tupled() -> (Element, Element) { (self[0], self[1]) }
func tupled() -> (Element, Element, Element) { (self[0], self[1], self[2]) }
func tupled() -> (Element, Element, Element, Element) { (self[0], self[1],
self[2], self[3]) }
/// Returns a new string by concatenating the elements of the sequence,
/// adding the given separator between each element.
///
/// The following example shows how an array of Ints can be joined to a
/// single, comma-separated string:
///
/// let numbers = [1, 4, 2, 6]
/// let list = numbers.joinedAsString(separator: ", ")
/// print(list)
/// // Prints "1, 4, 2, 6"
///
/// - Parameter separator: A string to insert between each of the elements
/// in this sequence. The default separator is an empty string.
/// - Returns: A single, concatenated string.
func joinedAsString(separator: String = "") -> String {
self.map {"\($0)"}.joined(separator: separator) } }
// ===============
// Data Structures
// ===============
// based on: https://atcoder.jp/contests/abc235/submissions/28562251
struct Queue<T> {
private var data = [T](), pos=0
var isEmpty:Bool{ data.count==pos }
var front:T?{isEmpty ? nil : data[pos]}
mutating func push(_ t:T) { data.append(t) }
mutating func push(_ ts:[T]) { data.append(contentsOf: ts) }
mutating func pop()->T?{
if isEmpty { return nil }
pos += 1; return data[pos-1] }}
// based on: https://github.com/davecom/SwiftPriorityQueue/blob/7b4aa89d9740779f6123929c3e9e7e6b86b83671/Sources/SwiftPriorityQueue/SwiftPriorityQueue.swift
struct PriorityQueue<T> {
var heap = [T](); let order: (T, T) -> Bool
init(_ startingValues: ArraySlice<T> = [], order: @escaping (T, T) -> Bool) {
self.order = order; push(startingValues) }
init(_ startingValues: [T], order: @escaping (T, T) -> Bool) {
self.init(startingValues[...], order: order)}
var count: Int { heap.count }; var isEmpty: Bool { heap.isEmpty }
private mutating func sink(_ index: Int) {
var index = index
while 2 * index + 1 < count {
var j = 2 * index + 1
if j < (count - 1) && order(heap[j+1], heap[j]) { j += 1 }
guard order(heap[j], heap[index] ) else { break }
heap.swapAt(j, index); index = j } }
private mutating func swim(_ index: Int) {
var index = index
while index > 0 && order(heap[index], heap[(index - 1) / 2]) {
heap.swapAt(index, (index - 1) / 2)
index = (index - 1) / 2 } }
mutating func push(_ element: T) { heap.append(element); swim(count - 1) }
mutating func push(_ elements: ArraySlice<T>) { elements.forEach { push($0) } }
mutating func push(_ elements: [T]) { push(elements[...]) }
mutating func pop() -> T? {
guard !isEmpty else { return nil }
heap.swapAt(0, count - 1)
defer { sink(0) }
return heap.removeLast() } }
extension PriorityQueue where T: Comparable {
init(_ startingValues: ArraySlice<T> = [], smallerFirst: Bool = true) {
self.init(startingValues, order: smallerFirst ? {$0 < $1} : {$0 > $1}) }
init(_ startingValues: [T], smallerFirst: Bool = true) {
self.init(startingValues[...], smallerFirst: smallerFirst)} }
extension PriorityQueue: IteratorProtocol {
mutating func next() -> T? { return pop() }}
extension PriorityQueue: Sequence {
func makeIterator() -> PriorityQueue<T> { return self }}
extension PriorityQueue: Collection {
var startIndex: Int { return heap.startIndex }
var endIndex: Int { return heap.endIndex }
subscript(i: Int) -> T { return heap[i] }
func index(after i: Int) -> Int { return heap.index(after: i) }}
extension PriorityQueue: CustomStringConvertible, CustomDebugStringConvertible {
var description: String { return heap.description }
var debugDescription: String { return heap.debugDescription }}
// Based on: https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_1_A&lang=jp
struct DisjointSet {
private var rank: [Int]; private var p: [Int]
init(_ size: Int) {
rank = [Int](); p = [Int]()
for x in 0..<size { p.append(x); rank.append(0) }}
mutating func same(_ x: Int, _ y: Int) -> Bool { return findSet(x) == findSet(y) }
mutating func unite(_ x: Int, _ y: Int) { link(x, y) }
private mutating func findSet(_ x: Int) -> Int {
if x != p[x] { p[x] = findSet(p[x]) }
return p[x] }
private mutating func link(_ x: Int, _ y: Int) {
let a = findSet(x), b = findSet(y)
if rank[a] > rank[b] { p[b] = a
} else {
p[a] = b
if rank[a] == rank[b] { rank[b] += 1 } }}}
// =========
// Functions
// =========
/// Power of Ints
/// - Parameters:
/// - base: Base number to be powered
/// - index: The exponent
/// - Returns: Int of the exponential number. `nil` if the result is beyond Int.
func pow(_ base: Int, _ index: Int) -> Int? {
let result = pow(Double(base), Double(index))
guard result <= Double(Int.max) && result >= Double(Int.min) else { return nil }
return Int(result) }
func gcd(_ a: Int, _ b: Int) -> Int {
if b == 0 { return a }
return gcd(b, a%b)
}
func pf(_ numb: Int) -> [(prime: Int, count: Int)] {
var n = numb, i = 2, primeList = [(Int, Int)]()
while i * i <= numb && i <= n {
var count = 0
while n % i == 0 { n /= i; count += 1 }
if count > 0 { primeList.append((i, count)) }
i += 1
}
if n != 1 { primeList.append((n, 1)) }
return primeList
}
// reference https://ioritsutsui.com/permutation-full-enumeration/
func permutation<T>(_ args: [T]) -> [[T]] {
guard args.count > 1 else { return [args] }
func rotate(_ arr: [T]) -> [T] { return arr.dropFirst() + [arr.first!] }
var rotatedValue = args
var result = [[T]]()
for _ in 0..<args.count {
let head = rotatedValue.first!
let tails = Array(rotatedValue.dropFirst())
for arr in permutation(tails) {
result.append([head] + arr)
}
rotatedValue = rotate(rotatedValue)
}
return result
}
Submission Info
| Submission Time |
|
| Task |
D - ABC Transform |
| User |
tockrock |
| Language |
Swift (5.2.1) |
| Score |
400 |
| Code Size |
8234 Byte |
| Status |
AC |
| Exec Time |
327 ms |
| Memory |
13900 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
400 / 400 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
example0.txt, example1.txt |
| All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, example0.txt, example1.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 000.txt |
AC |
61 ms |
12552 KiB |
| 001.txt |
AC |
16 ms |
13804 KiB |
| 002.txt |
AC |
309 ms |
12772 KiB |
| 003.txt |
AC |
317 ms |
13872 KiB |
| 004.txt |
AC |
178 ms |
13252 KiB |
| 005.txt |
AC |
325 ms |
13564 KiB |
| 006.txt |
AC |
325 ms |
13480 KiB |
| 007.txt |
AC |
327 ms |
13528 KiB |
| 008.txt |
AC |
247 ms |
12800 KiB |
| 009.txt |
AC |
246 ms |
12532 KiB |
| 010.txt |
AC |
255 ms |
13612 KiB |
| 011.txt |
AC |
247 ms |
13112 KiB |
| 012.txt |
AC |
258 ms |
13552 KiB |
| 013.txt |
AC |
176 ms |
12832 KiB |
| 014.txt |
AC |
194 ms |
13608 KiB |
| 015.txt |
AC |
176 ms |
12780 KiB |
| 016.txt |
AC |
176 ms |
12832 KiB |
| 017.txt |
AC |
195 ms |
13900 KiB |
| 018.txt |
AC |
193 ms |
13548 KiB |
| 019.txt |
AC |
178 ms |
12600 KiB |
| 020.txt |
AC |
174 ms |
12600 KiB |
| 021.txt |
AC |
192 ms |
13560 KiB |
| example0.txt |
AC |
9 ms |
12964 KiB |
| example1.txt |
AC |
9 ms |
12692 KiB |