正在载入在线练习界面,本页内容可直接阅读…
AK CSP › NOIP 普及 2012 第一轮真题 › 第 26 题
NOIP 普及 2012 第一轮 第 26 题:求字符串的字典序最小循环移位
题目
```
#include <iostream>
#include <string>
using namespace std;
int n,i,j,ans;
string s;
char get(int i)
{
if(i<n) return s[i];
else return s[i-n];
}
int main()
{
cin>>s;
n=s.size();
ans=0;
for(i=1;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
if(get(i+j)<get(ans+j))
{
ans=i;
break;
}
else if(get(i+j)>get(ans+j)) break;
}
for(j=0;j<=n-1;j++) cout<<get(ans+j);
cout<<endl;
return 0;
}
```
输入:CBBADADA本小题
阅读程序写结果
答案
ACBBADAD
题解
考点定位
字符串最小循环表示。
解题过程
实际输入为 CBBADADA,长度为 8。get 会把超过末尾的下标减去 n,从而读取循环串。程序逐一比较起点,保留字典序最小的循环移位。
最小串必以 A 开头,只需比较三个候选:
| 起点(从0计数) | 循环移位 |
|---|---|
| 3 | ADADACBB |
| 5 | ADACBBAD |
| 7 | ACBBADAD |
起点 7 的第二个字符是 C,另外两串第二个字符都是 D,且 C<D。因此最小串为 ACBBADAD。
答案:ACBBADAD。
易错提醒
最后一个字符也可以作为起点。程序从 1 枚举到 n−1,初始候选是 0,覆盖了全部 8 个起点。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号