Live2d Test Env

ZOJ2006 一道很尴尬的string操作题

                                          ZOJ2006(最小表示法)

 题目大意:输出第一个字符串的最小字典序字串的下标!

然后我居然想试一试string的erase的能力,暴力一下,然后20msAC了,尴尬的数据。。。。。。。。。。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
using namespace std;
string s,Min;
char temp;
int Pos;
void _work()
{
	cin>>s;
	Min=s;
	Pos=1;
	int L=s.length();
	  for(int i=2;i<=L;i++){
	    temp=s[0];
	    s.erase(s.begin());
	    s+=temp;
	    if(s<Min) {Min=s;Pos=i;}
    }
    printf("%d\n",Pos);
	
}
int main()
{
	int T;
	cin>>T;
    while(T--) _work();
	return 0;
}
当然正解也简单。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 200017;
char str[maxn], tmp[maxn];
//最小表示法
int len;
int _minstring(char *s)
{
    int len = strlen(s);
    int i = 0, j = 1, k = 0;
    while(i<len && j<len && k<len)
    {
        int t=s[(i+k)%len]-s[(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 min(i,j);
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        //scanf("%d",&len);
        scanf("%s",str);
        int ans=_minstring(str);
        cout<<ans+1<<endl;
    }
    return 0;
}


0
0

posted @ 2017-09-27 21:06  nimphy  阅读(105)  评论(0编辑  收藏  举报