1550: AA
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 125 Solved: 35
[Submit][Status][Web Board]
Description
其实第一次听说要出题目我是拒绝的,因为,你不能让我出,我就马上去出,我要试一下,因为我不愿意出完了以后再加一些案例上去,然后题目duang的一下就被AC了。现在要求对字符串进行环状左移操作,每次向左移动一个位置。例如:对duang进行操作,得到的全部字符串为:
duang
uangd
angdu
ngdua
gduan
输出得到最小字典序的字符串的最小移动次数。
Input
输入一个数T(1<=T<=100),表示接下来有T行字符串;输入字符串S,S的长度为L(5<=l<=100000)。
Output
输出一个数字,表示为得到最小字典序的字符串的最小移动次数。
Sample Input
2
baabaa
alabala
Sample Output
1
6
解析:这道题考的就是字符串的最小表示法。起先我做的是直接求,不是超时就是超内存。这让我学到了很多,有时候我做题目并不是为AC,而是去学更多的东西,虽然错了很多次,但是你会知道是由于什么错了,可以学更多。
最小表示法------详细看博客
#include<bits/stdc++.h>
using namespace std;
#define e exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int _find(string str)
{
int i = 0;
int j = 1;
int k = 0;
int len = str.size();
while(i<len && j<len && k<len )
{
int t = str[(i+k)%len] - str[(j+k)%len];
if(t == 0)
k++;
else
{
if(t>0)
i+=(k+1);
else
j+=(k+1);
if(i == j)
j++;
k=0;
}
}
return i<j?i:j;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
string s;cin>>s;
int cnt=_find(s);
printf("%d\n",cnt);
}
return 0;
}