PKU 3367 Expressions 題解
這個題目先開始一直沒有好的想法。題目也是看了很久才看懂
師姐先開始的想法很好但是我沒有去做。
最后兜了很大一個圈子還是回到了以前的想法
就是模擬的去建一個數然后給每個位置標號沒上成一層就加1
然后再從樹根上往下掃一遍。然后樹根為1每個位置往下的時候加一
然后這個排序就可以了
最后這個題代碼由敏哥完成了
1
#include<stdio.h>
2
#include<algorithm>
3
using namespace std;
4
5
struct nn
6

{
7
int dp,m,mark;
8
}pt[10010];
9
10
int len,t;
11
char str[11000];
12
13
void di(int deep)
14

{
15
pt[t].dp = deep;
16
pt[t].m = str[len];
17
pt[t++].mark = t;
18
if(str[len] >= 'A' && str[len] <= 'Z')
19
{
20
len--;
21
di(deep+1);
22
di(deep+1);
23
return;
24
}
25
if(str[len] >= 'a' && str[len] <= 'z')
26
{
27
len--;
28
return;
29
}
30
}
31
32
int cmp(nn a, nn b)
33

{
34
if(a.dp != b.dp)
35
return a.dp > b.dp;
36
else
37
return a.mark < b.mark;
38
}
39
40
int main()
41

{
42
int n,i;
43
scanf("%d", &n);
44
while(n--)
45
{
46
scanf("%s",str);
47
len = strlen(str)-1;
48
t = 0;
49
di(0);
50
sort(pt,pt+t,cmp);
51
for(i = 0; i < t; i++)
52
printf("%c",pt[i].m);
53
printf("\n");
54
}
55
return 0;
56
}
57
58
#include<stdio.h>2
#include<algorithm>3
using namespace std;4

5
struct nn6


{7
int dp,m,mark;8
}pt[10010];9

10
int len,t;11
char str[11000];12

13
void di(int deep)14


{15
pt[t].dp = deep;16
pt[t].m = str[len];17
pt[t++].mark = t;18
if(str[len] >= 'A' && str[len] <= 'Z')19

{20
len--;21
di(deep+1);22
di(deep+1);23
return;24
}25
if(str[len] >= 'a' && str[len] <= 'z')26

{27
len--;28
return;29
}30
}31

32
int cmp(nn a, nn b)33


{34
if(a.dp != b.dp)35
return a.dp > b.dp;36
else 37
return a.mark < b.mark;38
}39

40
int main()41


{42
int n,i;43
scanf("%d", &n);44
while(n--)45

{46
scanf("%s",str);47
len = strlen(str)-1;48
t = 0;49
di(0);50
sort(pt,pt+t,cmp);51
for(i = 0; i < t; i++)52
printf("%c",pt[i].m);53
printf("\n");54
}55
return 0;56
}57

58


