HDU - 6294 SA-IS后缀数组
小Q最近阅读了SA-IS算法在线性时间内构造后缀数组的相关论文,面对任何字符串题,都可以想出线性时间的算法。
小T在经历过二分图匹配事件后,再也不相信小Q所说的话。面对小Q,小T又给出了一道字符串题:
给定一个长度为nn
的小写字符串S[1..n]S[1..n]
,设sufisufi
表示以ii
为开始的后缀,即S[i..n]S[i..n]
。
记|X||X|
为字符串XX
的长度,对于两个字符串XX
和YY
,定义XX
的字典序比YY
小,当且仅当存在非负整数k(k≤min(|X|,|Y|))k(k≤min(|X|,|Y|))
使得XX
的前kk
个字符与YY
的前 kk
个字符对应相同,并且要么满足|X|=k|X|=k
且|Y|>k|Y|>k
,要么满足k<min(|X|,|Y|)k<min(|X|,|Y|)
且XX
的第k+1k+1
个字符比YY
的第k+1k+1
个字符小。例如aa的字典序比aaa小,ab的字典序比ba小。
请对每个i(1≤i<n)i(1≤i<n)
,判断sufisufi
和sufi+1sufi+1
的字典序大小关系。
只会吹牛的小Q又不会做了,所以他再一次向你紧急求助。请写一个程序,判断相邻两个后缀的大小关系。Input第一行包含一个正整数T(1≤T≤10)T(1≤T≤10)
,表示测试数据的组数。
每组数据第一行包含一个正整数n(2≤n≤1000000)n(2≤n≤1000000)
,表示字符串SS
的长度。
第二行包含一个长度为nn
的小写字符串SS
。
Output
对于每组数据,输出一行n−1n−1 个字符,第ii 个字符表示sufisufi 和sufi+1sufi+1 的大小关系,若sufi<sufi+1,输出< ,否则输出> ,显然不存在相等关系。
Sample Input
1 17 quailtyacmbestacm
Sample Output
<><<<<><<><<<><<
思路:如果s[i]<s[i+1]则输出<;如果s[i]>s[i+1]则输出>;否则就把相等的个数sign相加,循环sign次,输出和最后那个关系一样的符号( < 或 > )
#include <cstdio> #include <iostream> #include <string> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> #include <map> using namespace std; int t, n; char s[1000000+8]; int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); scanf("%s", s); int sign = 1; for(int i = 0; i<n-1; i++) { if(s[i]<s[i+1]) { while(sign--) printf("<"); sign = 1; } else if(s[i]>s[i+1]) { while(sign--) printf(">"); sign = 1; } else sign++; } while(--sign) printf(">"); printf("\n"); } return 0; }