0w1

ABC 030 D - へんてこ辞書 ( Ad hoc )

D: へんてこ辞書 - AtCoder Beginner Contest 030 | AtCoder
Find the length before getting into the cycle, and the length of the cycle. Then get K in mod len_cycle, O( N ).

const int MAXN = 1e5 + 2;

int N, A;
string K;
int B[ MAXN ];

void solve(){
    cin >> N >> A; --A;
    cin >> K;
    for( int i = 0; i < N; ++i )
        cin >> B[ i ], --B[ i ];

    vi step2node, node2step( N, -1 );
    int len_before_c = -1;
    int len_cycle = -1;
    for( int u = A; ; u = B[ u ] ){
        if( node2step[ u ] != -1 ){
            len_before_c = node2step[ u ];
            len_cycle = step2node.size() - len_before_c;
            break;
        }
        node2step[ u ] = step2node.size();
        step2node.push_back( u );
    }

    if( K.size() < 7 and stoi( K ) < len_before_c ){
        cout << step2node[ stoi( K ) ] + 1 << "\n";
        return;
    }

    int k = 0;
    for( int i = 0; i < K.size(); ++i )
        ( k = k * 10 + K[ i ] - '0' ) %= len_cycle;

    k -= len_before_c; k %= len_cycle; k += len_cycle; k %= len_cycle;
    cout << step2node[ len_before_c + k ] + 1 << "\n";
}