`
kmplayer
  • 浏览: 509985 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

国际大学生程序设计竞赛例题_5.20 BOB

 
阅读更多
1,题意:将一个字符串首尾连接,找出字典排序最小的字符串.
2,解决:
初始化连个位置p=0,q=1,往后扫描tp,tq分别记录扫描位置.
如果s[tp]<s[tq],那么q=tq+1;
如果s[tp]>s[tq],那么p=tp+1;
同时保证q大于p,扫描一次得到的p,既是开始的位置.
3,实现代码
#include <iostream>
using namespace std;

#define MAX 20010 //串的最大长度
char str[MAX];
char str2[MAX]; //辅助串

int main()
{
    freopen("5.20.in","r",stdin);
    int cnt;
    long p,q,tp,tq,len;
    cin>>cnt;
    while(cnt--)
    {
        cin>>str;
        len=strlen(str);
        for(int i=0;i<len;i++)
            str2[i]=str2[i+len]=str[i];
        p=0;
        q=1;
        cout<<len<<endl;
        while(q<len)
        {
            tp=p;
            tq=q;
            while(tp-p<len)
            {
                if(str2[tp]==str2[tq]) tp++,tq++;
                else if(str2[tp]<str2[tq])
                {
                    q=tq+1;
                    break;
                }
                else
                {
                    p=tp+1;
                    if(p>=q) q=p+1; //始终保证q在p后面
                    break;
                }
            }
            if(tp-p==len) break;
        }
        for(int i=0;i<len;i++)
            cout<<str2[p+i];
        cout<<endl;
    }
    return 0;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics