可以這麼想,最短的就是把最大的放在前面,最長的就是最小的放在前面,例如
7,>><>><,先生成一個,7654321,再根據小於號顛倒,同理,1234567,根據正負號顛倒。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
char s[200005];
int a[200005];
void solve()
{
int n, m;
cin >> n >> s;
m = n;
for (int i = 0; i < n; i++)
{
int st = 1;
while (i < strlen(s) && s[i] == '<')
{
st++;
i++;
}
for (int j = i; j > i - st; 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 st = 1;
while (i < strlen(s) && s[i] == '>')
{
st++;
i++;
}
for (int j = i; j > i - st; j--)
{
a[j] = m;
m++;
}
}
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
solve();
}
既然思路如此,那就有個更簡單的代碼。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
char s[200005];
int a[200005];
int b[200005];
void swap(int a_, int b_) //交換的一個函數,將傳入的數組中的一段倒置。
{ for (int i = a_; i<=b_; i++)
{
b[i] = a[b_-(i-a_)];
}
for (int i = a_; i <= b_; i++)
{
a[i] = b[i];
}
}
void solve()
{
int n, m;
cin >> n >> s;
m = n;
for (int i = 0; i < n; i++)
{
a[i] = m;
m--;
}
for (int i = 0; i < n; i++)
{
if (s[i] == '<')
{
int j = i;
int c = 1;
while (s[i] == '<')
{
c++;
i++;
}
swap(j, j+c-1);
}
}
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
m = 1;
for (int i = 0; i < n; i++)
{
a[i] = m;
m++;
}
for (int i = 0; i < n; i++)
{
if (s[i] == '>')
{
int j = i;
int c = 1;
while (s[i] == '>')
{
c++;
i++;
}
swap(j, j + c - 1);
}
}
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
solve();
}