forked from ngthanhtrung23/CompetitiveProgramming
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathB.cpp
More file actions
77 lines (65 loc) · 1.97 KB
/
B.cpp
File metadata and controls
77 lines (65 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; ++i)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; --i)
#define REP(i,a) for(int i=0,_a=(a); i < _a; ++i)
#define DEBUG(X) { cout << #X << " = " << X << endl; }
#define PR(A,n) { cout << #A << " = "; FOR(_,1,n) cout << A[_] << ' '; cout << endl; }
#define PR0(A,n) { cout << #A << " = "; REP(_,n) cout << A[_] << ' '; cout << endl; }
#define sqr(x) ((x) * (x))
#define ll long long
#define SZ(x) ((int) (x).size())
using namespace std;
const int MN = 555;
string s[MN];
int n;
int minmove(vector<string> s) {
int n = SZ(s);
int x, y, i, j, u, v; // x is the smallest string before string y
for (x = 0, y = 1; y < n; ++ y) {
i = u = x;
j = v = y;
while (s[i] == s[j]) {
++ u; ++ v;
if (++ i == n) i = 0;
if (++ j == n) j = 0;
if (i == x) break; // All strings are equal
}
if (s[i] <= s[j]) y = v;
else {
x = y;
if (u > y) y = u;
}
}
return x;
}
vector<string> best, cur;
string rots[MN];
int main() {
ios :: sync_with_stdio(0); cin.tie(0);
freopen("matrix.in", "r", stdin);
freopen("matrix.out", "w", stdout);
cin >> s[0];
n = SZ(s[0]);
FOR(i,1,n-1) cin >> s[i];
REP(j,n) {
REP(i,n) rots[j] += s[i][j];
}
// REP(i,n) DEBUG(s[i]);
// REP(j,n) DEBUG(rots[j]);
REP(j,n) {
vector<string> all;
REP(i,n) {
all.push_back(s[i].substr(j) + s[i].substr(0, j));
}
// DEBUG(j);
// for(auto s : all) cout << s << ' '; cout << endl;
int i = minmove(all);
cur.clear();
for(int turn = 0, ii = i; turn < n; ++turn, ii = (ii + 1) % n) {
cur.push_back(all[ii]);
}
if (j == 0 || cur < best) best = cur;
}
for(auto s : best) cout << s << '\n';
cout << endl;
}