6294 SA-IS字尾陣列 (思維)
阿新 • • 發佈:2019-02-12
題意: 就是給你字串,之後問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 */