AGC023 B - Find Symmetries
問題ページ
B - Find Symmetries
考えたこと
- とりあえずよい盤面を書いてみる
- 斜めにずらしたとしてもよい盤面であるのは絶対に変わらない
- したがってB=iとしたときによい盤面であれば斜めにずらしてもよい盤面
- O(N^3)なので書くとサンプルが通らない
- 対称な位置の座標で変なことになってる
- よくわからなかったので実際にずらしたあとの盤面を毎回つくることにしたら通った
(i,j+k)の反転を(j+k,i)にしていた(は?
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int ll using VI = vector<int>; using VVI = vector<VI>; using PII = pair<int, int>; #define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i) #define REP(i, n) FOR(i, 0, n) #define ALL(x) x.begin(), x.end() #define PB push_back signed main(void) { cin.tie(0); ios::sync_with_stdio(false); int n; cin >> n; vector<string> s(n); REP(i, n) cin >> s[i]; int ret = 0; REP(i, n) { vector<string> t(n); REP(j, n) t[j] = s[j].substr(i+1) + s[j].substr(0, i+1); bool flag = true; REP(j, n) REP(k, n) { if(t[j][k] != t[k][j]) { flag = false; } } if(flag) ret += n; } cout << ret << endl; return 0; }