Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/STACK:256000000")
- #define _CRT_SECURE_NO_WARNINGS
- #define _CRT_SECURE_NO_DEPRECATE
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<string>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include <set>
- #include <queue>
- #include <map>
- #include <vector>
- #include <unordered_map>
- #include <assert.h>
- using namespace std;
- #define mp make_pair
- #define pub push_back
- #define con continue
- #define forn(i, n) for (int i = 0; i < int(n); ++i)
- #define fornr(i, n) for (int i = n - 1; i >= 0; --i)
- #define forab(i, a, b) for (int i = (a); i <= int(b); ++i)
- typedef long long ll;
- typedef pair <int, int> pii;
- typedef vector <int> vi;
- typedef vector < pii > vii;
- typedef vector < vector < int> > vvi;
- typedef vector < vector < pair < int, int > > > vvii;
- const int ZEROS = (int)(1E+5 + 100);
- const int INF = (int)1E+9;
- ll P[ZEROS];
- ll H[ZEROS];
- ll ppp = 1301, mod = 1E+9 + 7;
- int n;
- string s;
- vi p;
- void gen_hash() {
- ll a = 1;
- for (int i = 1; i <= n; ++i) {
- P[i] = a;
- a *= ppp;
- a %= mod;
- }
- for (int i = 1; i <= n; ++i)
- H[i] = (H[i - 1] + ((s[i - 1]) * P[i]) % mod) % mod;
- }
- ll get_hash(int l, int r) {
- return (((H[r] - H[l - 1] + mod) % mod) * P[n - r + 1])
- % mod;
- }
- int eq(int l1, int r1, int l2, int r2) {
- ll h1 = get_hash(l1, r1);
- ll h2 = get_hash(l2, r2);
- return h1 == h2;
- }
- bool comp(int x, int y) {
- int l = 1; int r = min(n - x, n - y);
- int ans = 0;
- while (l <= r) {
- int mid = (l + r) / 2;
- if (eq(x, x + mid - 1, y, y + mid - 1)) {
- l = mid + 1;
- ans = mid;
- }
- else
- r = mid - 1;
- }
- if (x + ans <= n && y + ans <= n) {
- bool u = (s[x + ans] < s[y + ans]);
- return u;
- }
- else {
- bool u = (x > y);
- return u;
- }
- }
- void solve() {
- forn(i, (int)s.size())
- p.push_back(i + 1);
- sort(p.begin(), p.end(), comp);
- }
- int main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- getline(cin, s);
- n = (int)s.size();
- gen_hash();
- solve();
- forn(i, n)
- cout << p[i] << " ";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement