#include const int MAX = 510000; const int MOD = 1e9+7; long long fac[MAX], finv[MAX], inv[MAX]; #define _GLIBCXX_DEBUG #define int long long #define PI 3.14159265359 #define _Yes {cout<<"Yes"<; using vd = vector; using vi = vector; using vll = vector; using vs = vector; using vvc = vector; using vvd = vector; using vvi = vector; using vvll = vector; using vvs = vector; using pii = pair; using psi = pair; using pis = pair; using pic = pair; using pdd = pair; using vpii = vector; using vpic = vector; using vpsi = vector; using vpis = vector; using vpdd = vector; using tiii = tuple; using tsii = tuple; using tiis = tuple; using vtiii = vector; using mii = map; int FACT(ll n){if(n==0){return 1;}else{ll base=1;for(ll i=1;i<=n;i++){base*=i;}return base;}}//n! int FACTmod(ll n, int mod){if(n==0){return 1;}else{ll base=1;for(ll i=1;i<=n;i++){base=base*i%mod;}return base;}}//n!%mod vi DIVISOR(int n){ vi v; for (int i=1;i*i<=n;i++){ if(n%i==0) {v.push_back(i); if(i*i!=n)v.push_back(n/i);} } sort(ALL(v)); return v;} // 整数nの約数の昇順配列を出力 bool is_prime(long long N) { if (N == 1) return false; for (long long i = 2; i * i <= N; ++i) { if (N % i == 0) return false; } return true; } //素数判定 vi VEC_PRIME(int n) { // エラトステネスのふるい vi v; bitset<1000000> is_prime(0); // 十分大きなサイズを確保します for (int i = 2; i <= n; ++i) is_prime.set(i); // とりあえず全部ふるいに入れます for (int i = 2; i <= n; ++i) { if (is_prime[i]) { // 素数 i を発見したら for (int j = i * 2; j <= n; j += i) { is_prime.reset(j); // i の倍数をふるい落とす } } } // 結果出力 for (int i = 2; i <= n; ++i) { if (is_prime[i]) v.push_back(i); } return v; } void NCRinit(){fac[0]=fac[1]=1;finv[0]=finv[1]=1;inv[1]=1;for(int i=2; i0){if(n&1)ret*=x;x*=x;n>>=1;}return ret;}//x^n long long POWmod(int x,int n, int mod) {long long ret=1;while(n>0) {if(n&1)ret=ret*x%mod;x=x*x%mod;n>>=1;}return ret;}//x^n%mod ll GCD(ll x, ll y) {while(y>0){ll r=x%y;x=y;y=r;}return x;}//gcd ll LCM(ll x, ll y){return (x/GCD(x,y))*y;}//lcm int mNCR(int n,int r){ if(nn-r;i--){ ans=ans*i/x; x++; } return ans; } }//n.r小さいときのnCr vector > prime_factorize(long long N) { vector > res; for (long long a = 2; a * a <= N; ++a) { if (N % a != 0) continue; long long ex = 0; while (N % a == 0) { ++ex; N /= a; } res.push_back({a, ex}); } if (N != 1) res.push_back({N, 1}); return res; } //素因数分解 int MINVEC(vi v){ int min=2147483647; int ans=0; int n=v.size(); rep(i,n){ if(v[i]<=min){min=v[i];ans=i;} } return ans; } //viの最小項の番号を返す;//最大番号優先 int MAXVEC(vi v){ int max=-2147483648; int ans=0; int n=v.size(); rep(i,n){ if(v[i]>=max){max=v[i];ans=i;} } return ans; } //viの最大項の番号を返す;//最大番号優先 // aよりもbが大きいならばaをbで更新する // (更新されたならばtrueを返す) template bool chmax(T &a, const T& b) { if (a < b) { a = b; // aをbで更新 return true; } return false; } // aよりもbが小さいならばaをbで更新する // (更新されたならばtrueを返す) template bool chmin(T &a, const T& b) { if (a > b) { a = b; // aをbで更新 return true; } return false; } int MASSVEC(vi v, int x, int y){ int ans=0; for(int i=x;i<=y;i++){ ans+=v[i]; } return ans; } //ベクトルのx番目からy番目までの総和 vector> SECONDSORT(vector> v){ int n=v.size(); rep(i,n){swap(v[i].first,v[i].second);} sort(ALL(v)); rep(i,n){swap(v[i].first,v[i].second);} return v; } //vpiiをsecond優先で昇順ソート vector> SECONDrSORT(vector> v){ int n=v.size(); rep(i,n){swap(v[i].first,v[i].second);} sort(rALL(v)); rep(i,n){swap(v[i].first,v[i].second);} return v; } //vpiiをsecond優先で降順ソート //ABCDEFGHIJKLMNOPQRSTUVWXYZ //abcdefghijklmnopqrstuvwxyz signed main(void){ string s; cin>>s; string t=""; int n=s.size(); for(int i=0;i