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 }