Description :

Gildong recently learned how to find the longest increasing subsequence (LIS) in O(nlogn) time for a sequence of length n. He wants to test himself if he can implement it correctly, but he couldn’t find any online judges that would do it (even though there are actually many of them). So instead he’s going to make a quiz for you about making permutations of n distinct integers between Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define and Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_02, inclusive, to test his code with your output.

The quiz is as follows.

Gildong provides a string of length Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_03, consisting of characters Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_04 and Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_05 only. The i-th (1-indexed) character is the comparison result between the i-th element and the Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_06 element of the sequence. If the Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_07 character of the string is ‘<’, then the i-th element of the sequence is less than the Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_06 element. If the Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_07 character of the string is Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_05, then the Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_07 element of the sequence is greater than the Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_06

He wants you to find two possible sequences (not necessarily distinct) consisting of n distinct integers between Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define and Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_02, inclusive, each satisfying the comparison results, where the length of the LIS of the first sequence is minimum possible, and the length of the LIS of the second sequence is maximum possible.

Input

Each test contains one or more test cases. The first line contains the number of test cases Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define_15

Each test case contains exactly one line, consisting of an integer and a string consisting of characters Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_04 and Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_05 only. The integer is Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define_18, the length of the permutation you need to find. The string is the comparison results explained in the description. The length of the string is Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_03.

It is guaranteed that the sum of all n in all test cases doesn’t exceed Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_20.

Output

For each test case, print two lines with n integers each. The first line is the sequence with the minimum length of the LIS, and the second line is the sequence with the maximum length of the LIS. If there are multiple answers, print any one of them. Each sequence should contain all integers between Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define and Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_02, inclusive, and should satisfy the comparison results.

It can be shown that at least one answer always exists.

Example

inputCopy

3
3 <<
7 >><>><
5 >>><

outputCopy

1 2 3
1 2 3
5 4 3 7 2 1 6
4 3 1 7 5 2 6
4 3 2 1 5
5 4 2 1 3

Note

In the first case, Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define_23

In the second case, the shortest length of the LIS is Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_24, and the longest length of the LIS is Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_25. In the example of the maximum LIS sequence, Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_26

题意:

给你一个表示大小关系的序列,序列里只包含 Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_27Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_28,它表示的是一个序列里相邻的数字的大小关系。题目让你找出符合这个大小关系同时有着最短的“最长上升子序列”的序列,和符合这个大小关系同时有着最长的“最长上升子序列”的序列。

贪心来做,第一个序列先放大的,第二个序列放小的,比如 Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_子序列_29 如果找最大的序列,就先放 Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define,碰见小于号就让当前的值加 Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define,如果是大于号,找到 Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#define_32 这个位置,然后从这个地方贪心的放,Codeforces 1304 D. Shortest and Longest LIS(构造+贪心)_#include_33

AC代码:

#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <queue>
using namespace std;
#define sd(n) scanf("%d", &n)
#define sdd(n, m) scanf("%d%d", &n, &m)
#define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define pd(n) printf("%d\n", n)
#define pc(n) printf("%c", n)
#define pdd(n, m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n, m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld", &n)
#define sldd(n, m) scanf("%lld%lld", &n, &m)
#define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k)
#define sf(n) scanf("%lf", &n)
#define sc(n) scanf("%c", &n)
#define sff(n, m) scanf("%lf%lf", &n, &m)
#define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k)
#define ss(str) scanf("%s", str)
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define mem(a, n) memset(a, n, sizeof(a))
#define debug(x) cout << #x << ": " << x << endl
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define mod(x) ((x) % MOD)
#define gcd(a, b) __gcd(a, b)
#define lowbit(x) (x & -x)
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
inline int read()
{
int ret = 0, sgn = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
sgn = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
ch = getchar();
}
return ret * sgn;
}
inline void Out(int a)
{
if (a > 9)
Out(a / 10);
putchar(a % 10 + '0');
}

ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}

ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);
}
///快速幂m^k%mod
ll qpow(ll a, ll b, ll mod)
{
if (a >= mod)
a = a % mod + mod;
ll ans = 1;
while (b)
{
if (b & 1)
{
ans = ans * a;
if (ans >= mod)
ans = ans % mod + mod;
}
a *= a;
if (a >= mod)
a = a % mod + mod;
b >>= 1;
}
return ans;
}

// 快速幂求逆元
int Fermat(int a, int p) //费马求a关于b的逆元
{
return qpow(a, p - 2, p);
}

///扩展欧几里得
int exgcd(int a, int b, int &x, int &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int g = exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return g;
}

///使用ecgcd求a的逆元x
int mod_reverse(int a, int p)
{
int d, x, y;
d = exgcd(a, p, x, y);
if (d == 1)
return (x % p + p) % p;
else
return -1;
}

///中国剩余定理模板0
ll china(int a[], int b[], int n) //a[]为除数,b[]为余数
{
int M = 1, y, x = 0;
for (int i = 0; i < n; ++i) //算出它们累乘的结果
M *= a[i];
for (int i = 0; i < n; ++i)
{
int w = M / a[i];
int tx = 0;
int t = exgcd(w, a[i], tx, y); //计算逆元
x = (x + w * (b[i] / t) * x) % M;
}
return (x + M) % M;
}

int n;
const int N = 2e5 + 10;
int a[N];
int now, cnt;
string s;
int main()
{
int t;
sd(t);
while (t--)
{
sd(n);
cin>>s;
now = n;
cnt = 0;
rep(i, 0, n - 2)
{
if (s[i] == '>')
{
a[++cnt] = now;
now--;
}
else
{
int j;
for (j = i + 1; j < n - 1; j++)
{
if (s[j] == '>')
break;
}
for (int k = j; k >= i; k--)
{
a[k + 1] = now;
cnt++;
now--;
}
i = j;
}
}
if (cnt != n)
a[++cnt] = 1;
rep(i, 1, n)
{
printf("%d ", a[i]);
}
cout << '\n';
now = 1;
cnt = 0;
rep(i, 0, n - 2)
{
if (s[i] == '<')
{
a[++cnt] = now;
now++;
}
else
{
int j;
for (j = i + 1; j < n - 1; j++)
{
if (s[j] == '<')
break;
}
for (int k = j; k >= i; k--)
{
a[k + 1] = now;
cnt++;
now++;
}
i = j;
}
}
if (cnt != n)
a[++cnt] = n;
rep(i, 1, n)
{
printf("%d ", a[i]);
}
cout << '\n';
}
return 0;
}