传送门

 


 

A. Reverse a Substring

题意:

  给你一串 s,让你判断能否通过反转区间[l,r]的元素,使得反转后的串的字典序小于 s;

  如果能,输出 "YES",并输出任意的 l,r,并不需要所输出的 l,r 是所有满足条件的 l',r' 中的字典序最小的;

  反之,输出"NO";

  例如,如果串 s = "abaa"

  你可以反转[2,3]得到 "aaba"

  也可以反转[2,4]得到字典序更小的 "aaab"

  输出其中一个答案即可;

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define INF 0x3f3f3f3f
 4 #define INFull ~0ULL
 5 #define ll long long
 6 #define ull unsigned long long
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 const int maxn=3e5+50;
 9 
10 int n;
11 char s[maxn];
12 
13 void Solve()
14 {
15     int len=strlen(s+1);
16     int ans=len+1;
17     for(int i=2;i <= len;++i)
18         if(s[i] < s[i-1])//求出第一个下降的位置
19         {
20             ans=i;
21             break;
22         }
23     if(ans == len+1)//如果没找到下降的位置
24         printf("NO\n");
25     else
26     {
27         printf("YES\n");
28         printf("%d %d\n",ans-1,ans);//反转区间[ans-1,ans]
29     }
30 }
31 int main()
32 {
33 //    freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
34     scanf("%d",&n);
35     scanf("%s",s+1);
36     Solve();
37     return 0;
38 }
View Code

相关文章: