// BEGIN BOILERPLATE CODE
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;
#ifdef KAMIRULEZ
const bool kami_loc = true;
const long long kami_seed = 69420;
#else
const bool kami_loc = false;
const long long kami_seed = chrono::steady_clock::now().time_since_epoch().count();
#endif
const string kami_fi = "kamirulez.inp";
const string kami_fo = "kamirulez.out";
mt19937_64 kami_gen(kami_seed);
long long rand_range(long long rmin, long long rmax) {
uniform_int_distribution<long long> rdist(rmin, rmax);
return rdist(kami_gen);
}
long double rand_real(long double rmin, long double rmax) {
uniform_real_distribution<long double> rdist(rmin, rmax);
return rdist(kami_gen);
}
void file_io(string fi, string fo) {
if (fi != "" && (!kami_loc || fi == kami_fi)) {
freopen(fi.c_str(), "r", stdin);
}
if (fo != "" && (!kami_loc || fo == kami_fo)) {
freopen(fo.c_str(), "w", stdout);
}
}
void set_up() {
if (kami_loc) {
file_io(kami_fi, kami_fo);
}
ios_base::sync_with_stdio(0);
cin.tie(0);
}
void just_do_it();
void just_exec_it() {
if (kami_loc) {
auto pstart = chrono::steady_clock::now();
just_do_it();
auto pend = chrono::steady_clock::now();
long long ptime = chrono::duration_cast<chrono::milliseconds>(pend - pstart).count();
string bar(50, '=');
cout << '\n' << bar << '\n';
cout << "Time: " << ptime << " ms" << '\n';
}
else {
just_do_it();
}
}
int main() {
set_up();
just_exec_it();
return 0;
}
// END BOILERPLATE CODE
// BEGIN MAIN CODE
const int ms = 5e2 + 20;
const int st = 30;
const int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
int a[ms][ms];
int eq[ms][ms][8][st];
int n, m, L;
struct state {
int x = 0;
int y = 0;
int d = 0;
pair<int, int> p;
state(int _x, int _y, int _d) {
x = _x;
y = _y;
d = _d;
}
};
bool cmp1(state s1, state s2) {
return a[s1.x][s1.y] < a[s2.x][s2.y];
}
pair<int, int> get(state s, int k) {
int nx = (s.x + dx[s.d] * (1 << (k - 1))) % n;
if (nx < 0) {
nx += n;
}
int ny = (s.y + dy[s.d] * (1 << (k - 1))) % m;
if (ny < 0) {
ny += m;
}
return make_pair(eq[s.x][s.y][s.d][k - 1], eq[nx][ny][s.d][k - 1]);
}
bool cmp2(state s1, state s2) {
return s1.p < s2.p;
}
bool cmp3(state s1, state s2) {
for (int k = st - 1; k >= 0; k--) {
if (!((L >> k) & 1)) {
continue;
}
if (eq[s1.x][s1.y][s1.d][k] != eq[s2.x][s2.y][s2.d][k]) {
return eq[s1.x][s1.y][s1.d][k] < eq[s2.x][s2.y][s2.d][k];
}
s1.x += dx[s1.d] * (1 << k);
s1.x %= n;
s1.y += dy[s1.d] * (1 << k);
s1.y %= m;
if (s1.x < 0) {
s1.x += n;
}
if (s1.y < 0) {
s1.y += m;
}
s2.x += dx[s2.d] * (1 << k);
s2.x %= n;
s2.y += dy[s2.d] * (1 << k);
s2.y %= m;
if (s2.x < 0) {
s2.x += n;
}
if (s2.y < 0) {
s2.y += m;
}
}
return false;
}
void just_do_it() {
cin >> n >> m >> L;
vector<state> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char c;
cin >> c;
a[i][j] = c - 'a';
for (int k = 0; k < 8; k++) {
q.emplace_back(i, j, k);
}
}
}
sort(q.begin(), q.end(), cmp1);
int sz = q.size();
int cnt = 1;
for (int i = 0; i < sz; i++) {
if (i > 0 && a[q[i].x][q[i].y] != a[q[i - 1].x][q[i - 1].y]) {
cnt++;
}
eq[q[i].x][q[i].y][q[i].d][0] = cnt;
}
for (int k = 1; k < st; k++) {
for (int i = 0; i < sz; i++) {
q[i].p = get(q[i], k);
}
sort(q.begin(), q.end(), cmp2);
cnt = 1;
for (int i = 0; i < sz; i++) {
if (i > 0 && q[i].p != q[i - 1].p) {
cnt++;
}
eq[q[i].x][q[i].y][q[i].d][k] = cnt;
}
}
sort(q.begin(), q.end(), cmp3);
long long num = 0;
cnt = 0;
for (int i = 0; i < sz; i++) {
if (i > 0 && cmp3(q[i - 1], q[i])) {
num += 1LL * cnt * cnt;
cnt = 0;
}
cnt++;
}
num += 1LL * cnt * cnt;
long long den = 1LL * sz * sz;
long long g = __gcd(num, den);
num /= g;
den /= g;
cout << num << "/" << den;
}
// END MAIN CODE
Compilation message
osmosmjerka.cpp: In function 'void file_io(std::string, std::string)':
osmosmjerka.cpp:33:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
33 | freopen(fi.c_str(), "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
osmosmjerka.cpp:36:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
36 | freopen(fo.c_str(), "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
3 |
Correct |
2 ms |
468 KB |
Output is correct |
4 |
Correct |
7 ms |
980 KB |
Output is correct |
5 |
Correct |
35 ms |
2448 KB |
Output is correct |
6 |
Correct |
182 ms |
10012 KB |
Output is correct |
7 |
Correct |
2386 ms |
67712 KB |
Output is correct |
8 |
Runtime error |
215 ms |
262144 KB |
Execution killed with signal 9 |