洛谷 P1368, 工艺
Description
小敏和小燕是一对好朋友。
他们正在玩一种神奇的游戏,叫Minecraft。
他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。
他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。
两个工艺品美观的比较方法是,从头开始比较,如果第i个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。
Input
第一行两个整数n,代表方块的数目。 第二行n个整数,每个整数按从左到右的顺序输出方块瑕疵度的值。
Output
一行n个整数,代表最美观工艺品从左到右瑕疵度的值。
Sample Input
10 10 9 8 7 6 5 4 3 2 1
Sample Output
1 10 9 8 7 6 5 4 3 2
#include<bits/stdc++.h>
#define int long long int
using namespace std;
int n, ans;
int s[1000001];
int Min()
{
int i = 0, j = 1, k = 0;
while( i < n && j < n && k < n )
{
if( s[(i+k)%n] == s[(j+k)%n] )
{
k++;
}
else
{
if( s[(i+k)%n] > s[(j+k)%n] )
{
i = i + k + 1;
}
else
{
j = j + k + 1;
}
if( i == j )
{
j++;
}
k = 0;
}
}
return min( i, j );
}
signed main()
{
cin >> n;
for( int i = 0; i < n; i++ )
{
cin >> s[i];
}
ans = Min();
for( int i = 0; i < n; i++ )
{
cout << s[(ans+i)%n] << " ";
}
}
[BZOJ1398]项链
Description
给定两个项链的表示,判断他们是否可能是一条项链。
Input
输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。
Output
如果两条项链不可能同构,那么输出’No’,否则的话,第一行输出一个’Yes’
第二行输出该项链的字典序最小的表示。 设L = 项链长度,L <= 1000000。
Sample Input
2234342423 2423223434
Sample Output
Yes 2234342423
#include<bits/stdc++.h>
#define int long long int
using namespace std;
int n, ans1, ans2;
string a, b;
int Min( string s, int n )
{
int i = 0, j = 1, k = 0;
while( i < n && j < n && k < n )
{
if( s[(i+k)%n] == s[(j+k)%n] )
{
k++;
}
else
{
if( s[(i+k)%n] > s[(j+k)%n] )
{
i = i + k + 1;
}
else
{
j = j + k + 1;
}
if( i == j )
{
j++;
}
k = 0;
}
}
return min( i, j );
}
signed main()
{
cin >> a >> b;
n = a.length();
ans1 = Min( a, n );
ans2 = Min( b, n );
for( int i = 0; i < n; i++ )
{
if( a[(ans1+i)%n] != b[(ans2+i)%n] )
{
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
for( int i = 0; i < n; i++ )
{
cout << a[(ans1+i)%n];
}
}
[BZOJ2176]Strange string
Description
给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串S中, 子串T(|T| = n)为所有长度为n的S的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串.
Input
读入两行, 第一行为n, 第二行为字符串S.
Output
将”奇怪的字串” T输出
Sample Input
10 asdfasdfas
Sample Output
asasdfasdf
#include<bits/stdc++.h>
#define int long long int
using namespace std;
int n, ans1, ans2;
unsigned char a[100000001];
int Min( unsigned char s[], int n )
{
int i = 0, j = 1, k = 0;
while( i < n && j < n && k < n )
{
if( s[(i+k)%n] == s[(j+k)%n] )
{
k++;
}
else
{
if( s[(i+k)%n] > s[(j+k)%n] )
{
i = i + k + 1;
}
else
{
j = j + k + 1;
}
if( i == j )
{
j++;
}
k = 0;
}
}
return min( i, j );
}
signed main()
{
cin >> n;
cin >> a;
ans1 = Min( a, n );
for( int i = 0; i < n; i++ )
{
cout << a[(ans1+i)%n];
}
}