답안 #826505

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
826505 2023-08-15T16:07:54 Z QwertyPi Necklace (Subtask 1-3) (BOI19_necklace1) C++14
25 / 85
1500 ms 304 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;

struct answer{
	int a, x, y;
};

const int P = 1e9 + 7, A = 13895;
const int N = 3e4 + 11;
int norm(int x){
	return (x % P + P) % P;
}

int h_s[N], h_t[N], pw[N];

int hash_s(int i, int l){
	return norm(h_s[i + l] - h_s[i] * pw[l]);
}

int hash_t(int i, int l){
	return norm(h_t[i + l] - h_t[i] * pw[l]);
}

bool are_equal(int l, int i, int j){
	for(int k = 0; k < l; k++){
		if(hash_s(i, l) == norm(hash_t(j + k, l - k) * pw[k] + hash_t(j, k))){
			return true;
		}
	}
	return false;
}

int n, m; string s, t;
bool try_length(int l){
	for(int i = 0; i <= n - l; i++){
		for(int j = 0; j <= m - l; j++){
			bool ok = are_equal(l, i, j);
			if(ok) return true;
		}
	}
	return false;
}

answer construct_length(int l){
	for(int i = 0; i <= n - l; i++){
		for(int j = 0; j <= m - l; j++){
			bool ok = are_equal(l, i, j);
			if(ok) return {l, i, j};
		}
	}
	assert(1 == 0);
}

answer query(const string& s, const string& t){
	::s = s, ::t = t, n = s.size(), m = t.size();
	h_s[0] = 0; for(int i = 0; i < n; i++) h_s[i + 1] = (h_s[i] * A + s[i] - 'a') % P;
	h_t[0] = 0; for(int i = 0; i < m; i++) h_t[i + 1] = (h_t[i] * A + t[i] - 'a') % P;
	pw[0] = 1; for(int i = 0; i < max(n, m); i++) pw[i + 1] = pw[i] * A % P;

	for(int i = min(n, m); i >= 0; i--){
		if(try_length(i)){
			answer ans = construct_length(i);
			return ans;
		}
	}
	assert(0 == 1);
}

int32_t main(){
	string s, t; cin >> s >> t;
	answer a1 = query(s, t);
	reverse(t.begin(), t.end());
	answer a2 = query(s, t); a2.y = t.size() - (a2.y + a2.a);

	answer ans; ans.a = -1;
	if(a1.a > ans.a) ans = a1;
	if(a2.a > ans.a) ans = a2;
	cout << ans.a << endl;
	cout << ans.x << ' ' << ans.y << endl; 
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 212 KB Output is correct
2 Correct 3 ms 212 KB Output is correct
3 Correct 50 ms 212 KB Output is correct
4 Correct 64 ms 212 KB Output is correct
5 Correct 122 ms 288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 212 KB Output is correct
2 Correct 3 ms 212 KB Output is correct
3 Correct 50 ms 212 KB Output is correct
4 Correct 64 ms 212 KB Output is correct
5 Correct 122 ms 288 KB Output is correct
6 Correct 396 ms 304 KB Output is correct
7 Correct 1221 ms 304 KB Output is correct
8 Execution timed out 1564 ms 212 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 212 KB Output is correct
2 Correct 3 ms 212 KB Output is correct
3 Correct 50 ms 212 KB Output is correct
4 Correct 64 ms 212 KB Output is correct
5 Correct 122 ms 288 KB Output is correct
6 Correct 396 ms 304 KB Output is correct
7 Correct 1221 ms 304 KB Output is correct
8 Execution timed out 1564 ms 212 KB Time limit exceeded
9 Halted 0 ms 0 KB -