ferinの競プロ帳

競プロについてのメモ

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;
}