結果

問題 No.515 典型LCP
ユーザー claw88claw88
提出日時 2017-05-06 01:23:31
言語 C#(csc)
(csc 3.9.0)
結果
TLE  
実行時間 -
コード長 4,078 bytes
コンパイル時間 1,178 ms
コンパイル使用メモリ 114,660 KB
実行使用メモリ 52,444 KB
最終ジャッジ日時 2024-09-14 09:51:47
合計ジャッジ時間 5,761 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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>;

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 = cin.Nextint;
        var S = new string[N];
        var A = Enumerable.Range(0, N).ToArray();
        for (int i = 0; i < N; i++)
        {
            S[i] = cin.Next;
        }
        Array.Sort(S, A);
        //for (int i = 0; i < N; i++) WriteLine(S[i]);

        int M = cin.Nextint;
        var x = cin.Nextlong;
        var d = cin.Nextlong;
        var P = new long[N];
        var Q = new long[N];
        for (int i = 0; i < M; i++)
        {
            P[i] = x / (N - 1);
            Q[i] = x % (N - 1);
            if (P[i] > Q[i])
            {
                var t = P[i];
                P[i] = t;
                t = Q[i];
            }
            else Q[i]++;
            x = (x + d) % (N * (N - 1));
        }
        int n = 1;
        while (n < N) n *= 2;
        //WriteLine($"n={n}");
        var ST = new RMQ(n);
        for (int i = 1; i < N; 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;
            }
            //Write(" " +cnt);
            ST.Update(i - 1, cnt);
        }
        long ans = 0;
        for (int i = 0; i < M; i++)
        {
           
            //WriteLine(P[i] + " " + Q[i] + " " + A[P[i]] + " " + A[Q[i]]);
            ans += ST.Query(Math.Min(A[P[i]], A[Q[i]]), Math.Max(A[P[i]], A[Q[i]]), 0, 0, n);
            //WriteLine(ST.Query(A[P[i]], A[Q[i]], 0, 0, n));
        }
        WriteLine(ans);

        //WriteLine($"0={ST.dat[3]} 1={ST.dat[4]} 2 ={ST.dat[5]} 3 = {ST.dat[6]}");
    }
   

}

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