HDU - 6294 SA-IS后缀数组 (思维)

题意: 就是给你字符串,之后问sufi 和 sufi+1 的大小。

思路:对于字典序,我们先比较他么的字母大小,之后比较字符串长度就好了,那么这道题我最先想到的是一个一个去比较,遇到大的就输出,那么他的时间复杂度肯定是n^2的,由于是求后缀,那么我们我们其实可以利用后面的去推前面的,对于sufn和sufn+1 来说我们可以很轻易的得到 sufn > sufn+1 因为sufn+1 是一个空串儿,之后就可以比较了,那么对于sufn-1 和 sufn 我们可以比较他们两个的大小,如果n-1 大的话,那么就是 > ,反之一直往前递推就好了,对于两个字符串相等的情况,其实很容易想啊 ,就是直接按照原来的i-1就的大小就好了

上代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn =1000000+100;
char ch[maxn];
char ans[maxn];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		scanf("%s",ch);
		int len = strlen(ch);
		ans[len] = '>';
		if(ch[len-1] < ch[len-2]) ans[len-1] = '>';
		else if(ch[len-1] > ch[len-2]) ans[len-1] = '<';
		else ans[len-1] = ans[len];
		for(int i = len - 2 ; i >= 1 ; i --)
		{
			//cout<< ch[i] <<"   "<<ch[i]<<endl;
			if(ch[i] == ch[i-1]) ans[i] = ans[i+1];
			else ans[i] = (ch[i] > ch[i-1] ? '<' : '>'); 
		//	printf("%c \n",ans[i]);
		}
		for(int i = 1 ;i < len ;i ++)
		{
			printf("%c",ans[i]);
		}
		puts("");
	}
}
/*
5
7
bcdaaac
*/

猜你喜欢

转载自blog.csdn.net/wjmwsgj/article/details/80519672