zoukankan      html  css  js  c++  java
  • PKU 1509 Glass Beads (最小表示法)



    题意:有一个环形字符串,让你找一个位置切一刀使得字符串字母序最小。输出这个位置。


    思路:能够看成两个字符串比較。一个是从下标0開始(0~n-1),一个从下标1開始(1~n-1,0)。

    然后两个指针i=0,j=1.从s[i]和s[j]開始比較第k个字符是否同样,当k==len时,返回i,j中的最小值.当s[i+k]和s[j+k]不同样时,若s[i+k]>s[j+k]则可见从s[i+1]到s[i+k]都不会是最小字典序的起始位置,所以i=i+k+1.当s[i+k]<s[j+k]时同理.若移动后i==j则使正在移动的那个指针++.然后从新的s[i]和s[j]開始比較.



    #include<cstdio>
    #include<stdlib.h>
    #include<string.h>
    #include<string>
    #include<map>
    #include<cmath>
    #include<iostream>
    #include <queue>
    #include <stack>
    #include<algorithm>
    #include<set>
    using namespace std;
    #define INF 1e8
    #define eps 1e-8
    #define LL long long
    #define maxn 100010
    #define mol 1000000007
    
    int main()
    {
    	int t;
    	char s[10005];
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%s",s);
    		int i=0,j=1,k,len=strlen(s);
    		while(i<len&&j<len)
    		{
    			for(k=0;k<len;k++)
    			{
    				if(s[(i+k)%len]!=s[(j+k)%len])
    					break;
    			}
    			if(k==len) break;
    			if(s[(i+k)%len]>s[(j+k)%len])
    				i=i+k+1;
    			else j=j+k+1;
    			if(i==j) j=i+1;
    		}
    		printf("%d
    ",min(i,j)+1);
    	}
    	return 0;
    }
    /*
    4
    helloworld
    amandamanda
    dontcallmebfu
    aaabaaa
    */
    


  • 相关阅读:
    ELF文件格式解析
    了解ELF文件类型
    汇编程序-简介
    汇编指令入门级整理
    双系统: Windows10时间快和Ubuntu时间差问题
    iDRAC on DELL Server
    ubuntu WIFI 连接不稳定(wifi无法连接问题)
    删除字符串中的空格(空字符)
    VBS 基础知识
    VBS 操作Excel的常用方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5062807.html
Copyright © 2011-2022 走看看