結果

問題 No.515 典型LCP
ユーザー claw88claw88
提出日時 2017-05-06 02:46:07
言語 C#(csc)
(csc 3.9.0)
結果
TLE  
実行時間 -
コード長 3,637 bytes
コンパイル時間 3,275 ms
コンパイル使用メモリ 107,296 KB
実行使用メモリ 47,760 KB
最終ジャッジ日時 2023-10-12 11:43:51
合計ジャッジ時間 6,824 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Diagnostics;
using static System.Console;
using Pair = System.Collections.Generic.KeyValuePair<int, int>;
using System.Numerics;

class RMQ
{
    internal int n;
    internal int[] dat;

    public RMQ(int t)
    {
        n = t;
        dat = new int[2 * n - 1];
        for (int i = 0; i < 2 * n - 1; i++)
        {
            dat[i] = int.MaxValue;
        }
    }

    public void Update(int k, int a)
    {
        k += n - 1;
        dat[k] = a;
        while (k > 0)
        {
            k = (k - 1) / 2;
            dat[k] = Math.Min(dat[k * 2 + 1], dat[k * 2 + 2]);
        }
    }

    public int Query(int a, int b, int k, int l, int r)
    {
        if (r <= a || b <= l) return int.MaxValue;

        if (a <= l && r <= b) return dat[k];
        else
        {
            int vl = Query(a, b, k * 2 + 1, l, (l + r) / 2);
            int vr = Query(a, b, k * 2 + 2, (l + r) / 2, r);
            return Math.Min(vl, vr);
        }
    }
}
class Program
{
    static void Main()
    {
        //SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
        new Program().Solve();
        Out.Flush();
    }
    Scanner cin = new Scanner();
    Random rnd = new Random();
    Stopwatch sw = new Stopwatch();
    readonly int[] dd = { 0, 1, 0, -1, 0 };
    readonly int mod = 1000000007;
    readonly string alfa = "abcdefghijklmnopqrstuvwxyz";


    void Solve()
    {
        int N = int.Parse(ReadLine());
        var S = new string[N];
        var A = new int[N];
        for (int i = 0; i < N; i++)
        {
            S[i] = ReadLine();
            A[i] = i;
        }
        Array.Sort(S, A);
 
        int M = cin.Nextint; var x = cin.Nextlong; var d = cin.Nextlong;

        int n = 1; while (n < N) n *= 2; var ST = new RMQ(n);

        var B = new int[N];
        for (int i = 1; i < N; i++)
        {
            B[A[i]] = i;
            int cnt = 0;
            for (int j = 0; j < S[i - 1].Length && j < S[i].Length; j++)
            {
                if (S[i - 1][j] == S[i][j]) cnt++;
                else break;
            }
            ST.Update(i - 1, cnt);
        }

        long ans = 0;

        for (int i = 0; i < M; i++)
        {
            var P = x / (N - 1);
            var Q = x % (N - 1);
            if (P > Q)
            {
                var t = P;
                P = Q;
                Q = t;
            }
            else Q++;
            ans += ST.Query(Math.Min(B[P], B[Q]), Math.Max(B[P], B[Q]), 0, 0, n);
            x = (x + d) % ((long)N * (N - 1));
        }

        WriteLine(ans);

    }


}

class Scanner
{
    string[] s; int i;
    char[] cs = new char[] { ' ' };
    public Scanner() { s = new string[0]; i = 0; }
    public string[] Scan { get { return ReadLine().Split(); } }
    public int[] Scanint { get { return Array.ConvertAll(Scan, int.Parse); } }
    public long[] Scanlong { get { return Array.ConvertAll(Scan, long.Parse); } }
    public double[] Scandouble { get { return Array.ConvertAll(Scan, double.Parse); } }
    public string Next
    {
        get
        {
            if (i < s.Length) return s[i++];
            string st = ReadLine();
            while (st == "") st = ReadLine();
            s = st.Split(cs, StringSplitOptions.RemoveEmptyEntries);
            i = 0;
            return Next;
        }
    }
    public int Nextint { get { return int.Parse(Next); } }
    public long Nextlong { get { return long.Parse(Next); } }
    public double Nextdouble { get { return double.Parse(Next); } }
}
0