Codeforces Problem 708A Letters Cyclic Shift
Posted shuoed
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Problem 708A Letters Cyclic Shift相关的知识,希望对你有一定的参考价值。
题目链接:
http://codeforces.com/problemset/problem/708/A
题目大意:
从字符串s中挑选出一个子串(非空),将该子串中的每个字母均替换成前一个字母,如‘b‘换成‘a‘,‘c‘换成‘b‘,以此类推,特别的,‘a‘要换成‘z‘,问经过一次转换之后,字典序最小的字符串s为多少.注意“exactly one non-empty substring”这就意味着全‘a‘串也要变,即字符串"aaa",替换其中的字母(会使得字典序比原来大),但又要使字典序最小,所以只能将最后一个‘a‘->‘z‘==》字串变为“aaz”
解题思路:
代码可以解释解题思路
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[100002]; 4 int main() 5 { 6 int i,k; 7 while(~scanf("%s",s)) 8 { 9 k=0; 10 for(i=0; s[i]!=‘\0‘; i++) 11 if(s[i]!=‘a‘) 12 break; 13 for(; s[i]!=‘\0‘; i++) 14 { 15 if(s[i]==‘a‘) 16 break; 17 s[i]--; 18 k++; 19 } 20 if(!k) 21 s[strlen(s)-1]=‘z‘; 22 puts(s); 23 } 24 return 0; 25 }
第一次 for 如果 s[i]!=a 则break,如果 s[i]==a 则不对原数组改变,向后扫描(有一个k作为标识)
第二次for 一直扫描到尾,如果 !=a 则让该字符 s[i]-- ,同时作为标识的 k++,如果==a 则说明 a之前的数据已经处理完毕,已处理完“字串”,break,即可
判断标识,输出结果
举三个例子:
1.
输入:codeforces 输出:bncdenqbdr
k=0;i=0;
第一次 for
s[0] != a; break;
第二次 for
---一直没有等于a 的则将每个数都s[i]--;k++
if(!k)-- //k为非0 不执行 if 语句
输出 s即可
2.
输入:abacaba 输出:aaacaba
k=0;i=0;
第一次 for s[0]==‘a‘; s[0]不变
s[1]!=a; i=1;break;
第二次 for i=1
s[1]!=a; s[1]--;k++; //s[1]-- 其值原为 ‘b‘ 减减为 ‘a’
s[2]==a;break;//字串已处理结束,字串为“b”一个字符
if(!k)-- //k为非0 不执行 if 语句
输出 aaacaba
3.
输入:aaaa 输出:aaaz
k=0;i=0
第一次 for s[0]==‘a‘; s[0]不变
s[1]==‘a’; s[1] 不变
...
s[4]==‘\0‘ 跳出循环
第二次 for i=4 ;s[4]!=‘\0‘;//循环失效,不执行循环体
if(!k)-- //k为0 执行 if 语句 s[sizof(s)-1]=‘z‘;//sizeof(s)=4,s[3]=‘z‘;
输出 aaaz;
以上是关于Codeforces Problem 708A Letters Cyclic Shift的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 1197 D Yet Another Subarray Problem
CodeForces 863D Yet Another Array Queries Problem 暴力
Frets On Fire --- 2019 Codeforces Global Round 2 Problem D
CodeForces - 868F Yet Another Minimization Problem