結果

問題 No.515 典型LCP
ユーザー claw88claw88
提出日時 2017-07-13 12:35:30
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 263 ms / 1,000 ms
コード長 1,925 bytes
コンパイル時間 1,840 ms
コンパイル使用メモリ 106,060 KB
実行使用メモリ 18,688 KB
最終ジャッジ日時 2024-04-16 18:29:13
合計ジャッジ時間 4,934 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 263 ms
18,688 KB
testcase_01 AC 249 ms
18,688 KB
testcase_02 AC 144 ms
13,568 KB
testcase_03 AC 6 ms
11,392 KB
testcase_04 AC 6 ms
11,776 KB
testcase_05 AC 96 ms
13,312 KB
testcase_06 AC 96 ms
13,312 KB
testcase_07 AC 96 ms
13,568 KB
testcase_08 AC 120 ms
13,440 KB
testcase_09 AC 100 ms
14,208 KB
testcase_10 AC 100 ms
14,080 KB
testcase_11 AC 99 ms
14,080 KB
testcase_12 AC 99 ms
14,208 KB
testcase_13 AC 101 ms
13,568 KB
testcase_14 AC 26 ms
13,312 KB
testcase_15 AC 97 ms
13,184 KB
testcase_16 AC 97 ms
13,184 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <functional>
#include <utility>
using namespace std;
#define MOD 1000000007
#define ADD(X,Y) ((X) = ((X) + (Y)%MOD) % MOD)
typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec; typedef pair<string, int> pi;
int dd[] = { 0, 1, 0, -1, 0 };

int N;
pi P[114514];
string S[114514];
int ID[114514];
#define M 200010
#define K 18
int st[K][M];
int lcp[114514];

void construct(int *a, int n)
{
	copy_n(a, n, st[0]);
	for (int k = 1; k < K; k++)
	{
		for (int i = 0; i + (1 << k) <= n; i++)
		{
			st[k][i] = min(st[k - 1][i], st[k - 1][i + (1 << (k - 1))]);
		}
	}
}
int query(int a, int b)
{
	int k = 31 - __builtin_clz(b - a);
	return min(st[k][a], st[k][b - (1 << k)]);
}
int main()
{
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> S[i];
		P[i] = { S[i] , i };
	}
	sort(P, P + N);
	sort(S, S + N);
	for (int i = 0; i < N; i++)
	{
		ID[P[i].second] = i;
	}
	for(int i=1;i<N;i++)
	{
		int cnt = 0;
		for(int j=0;j<S[i-1].size()&&j<S[i].size();j++)
		{
			if(S[i-1][j]==S[i][j])cnt++;
			else break;
		}
		lcp[i-1]=cnt;
	}
	construct(lcp, N-1);
	
	/*for(int i = 0; i < N; i++)
	{
		cout << ID[i] << " " << P[i].second << endl;;
	}
	cout << endl;
	/*
	for(int j = 0; j < 4; j++)
	{
		for(int i = 0; i < N - 1; i++)
		{
			cout << st[j][i] << " ";
		}
		cout << endl;
	}*/
	
	int W; i64 x, d;
	cin >> W >> x >> d;
	i64 ans = 0;
	for(int i =0; i<W;i++)
	{
		int P = x / (N-1);
		int Q = x % (N-1);
		if(P>Q) swap(P,Q);
		else Q++;
		
		int  a = ID[P];
		int  b = ID[Q];
		if(a> b)swap(a, b);
		
		//cout << P << " " << Q << endl;
		//cout << a << " " << b << endl;
		ans += query(a,b);
		//cout << ans << endl;
		x = (x +d)% ((i64)N * (N-1));
	}
	cout << ans << endl;

	return 0;
}
0