zoukankan      html  css  js  c++  java
  • BZOJ2176Strange string——最小表示法

    题目描述

    给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的SS的字串中最小的(字符串的比较), 则称T为”奇怪的字串”. 你的任务就是找出这个字符串.

    输入

    读入两行, 第一行为n, 第二行为字符串S.

    输出

    将”奇怪的字串” T输出输入样例

    样例输入

    10
    asdfasdfas

    样例输出

    asasdfasdf

    提示

    数据范围
    对于100%的数据, 保证n≤10000000;
    给定的字符串中的字符保证在#33 ~ #254之间.

     
    最小表示法模板题,但要注意字符串要用unsigned char存,因为给定字符在#33~#254之间。
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<bitset>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int n,m;
    unsigned char s[20000010];
    int find()
    {
    	int l=1;
    	int r=2;
    	while(l<=n&&r<=n)
    	{
    		if(s[l]<s[r])
    		{
    			r++;
    		}
    		else if(s[l]>s[r])
    		{
    			l=r++;
    		}
    		else
    		{
    			int k;
    			for(k=1;k<n;k++)
    			{
    				if(s[l+k]>s[r+k])
    				{
    					l=r++;
    					break;
    				}
    				else if(s[l+k]<s[r+k])
    				{
    					r=r+k+1;
    					break;
    				}
    			}
    			if(k==n)
    			{
    				break;
    			}
    		}
    	}
    	return l;
    }
    int main()
    {
    	scanf("%d",&n);
    	scanf("%s",s+1);
    	for(int i=n+1;i<=2*n;i++)
    	{
    		s[i]=s[i-n];
    	}
    	m=find();
    	for(int i=m;i-m+1<=n;i++)
    	{
    		printf("%c",s[i]);
    	}
    }
  • 相关阅读:
    Scanner和BufferedReader
    java annotation
    java获取短uuid
    定时任务线程
    sql 查询最近30分钟或者自定义时间数据
    查看base64编码图片
    oracle 的PACKAGE恢复过程
    Oracle BFILE备忘
    读取Spring的配置文件applicationContext.xml的5种方法
    解决eclipse ctrl+鼠标左键不能用
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/10354784.html
Copyright © 2011-2022 走看看