题解 P6140 【[USACO07NOV]Best Cow Line S】

发布于 2020-11-21


题意

多组测试数据。

给你一个长度为N的字符串S,输入格式是依次输入N个字符。

N <= 2000。

每次你可以从S的开头或者结尾取出一个字符,放到一个T字符串的尾部。

输出字典序最小的T字符串,每80个字符换一行输出。

题解

不难,直接循环即可。但是输出略微毒瘤。

我们可以把情况分为两种:

两边字符不一样——直接把字典序小的拿出。

两边字符一样——继续寻找,找到不一样的,然后把字典序小的一边先拿出。

代码

#include<iostream>
#include<cstring>
using namespace std;
int n;
int suml,sumr,sum;
char a[30001],ans[30001];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	while(strlen(a)!=strlen(ans))
	{
		int l,r;
		r=strlen(a)-1-sumr;
		l=suml;
		while(l<r&&a[l]==a[r]) l++,r--;
		if(a[l]>a[r]) //第一种情况
        sumr++,ans[strlen(ans)]=a[strlen(a)-sumr];
		else suml++,ans[strlen(ans)]=a[suml-1];//否则,判断
	}
	for(int i=0;i<strlen(ans);i++)
	{
		cout<<ans[i];
		sum++;
		if(sum==80) sum=0,cout<<endl;//输出判断
	}
}