题意:
第一行输入T,有T组测试。
每组测试为一行,输入一个n 和长度为n-1的仅由< >组成的字符串,<代表左边的比数要比右边的数小,反之大。
输出:
第一行:用1~n结合符号构造一种最短的LIS(Longest Increasing Subsequence 最长上升子序列)并输出如何构造。
第二行:用1~n结合符号构造一种最长的LIS(Longest Increasing Subsequence 最长上升子序列)并输出如何构造。
思路:
贪心+模拟
贪心要使LIS最短即最前面的数越大越好,要使LIS最长即最前面的数越小越好,再结合符号满足题意的方案模拟并保存输出。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 +7;
const ll MAXN = 2e5 + 5;
int n,m,a[MAXN],b[MAXN];
string s;
void solve(){
cin>>n>>s;
m=n;
for(int i=0;i<n;i++){
int len=1;
while(i<s.size() && s[i]=='<'){
len++;
i++;
}
for(int j=i;j>i-len;j--){
a[j]=m;
m--;
}
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
m=1;
for(int i=0;i<n;i++){
int len=1;
while(i<s.size() && s[i]=='>'){
len++;
i++;
}
for(int j=i;j>i-len;j--){
b[j]=m;
m++;
}
}
for(int i=0;i<n;i++){
cout<<b[i]<<" ";
}
cout<<endl;
}
int main(){
int T;cin>>T;
while(T--){
solve();
}
return 0;
}