1. 程式人生 > >6294 SA-IS字尾陣列 (思維)

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
*/