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(kmin(|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(1i<n)i(1≤i<n) ,判断sufisufi 和sufi+1sufi+1 的字典序大小关系。

只会吹牛的小Q又不会做了,所以他再一次向你紧急求助。请写一个程序,判断相邻两个后缀的大小关系。Input第一行包含一个正整数T(1T10)T(1≤T≤10) ,表示测试数据的组数。

每组数据第一行包含一个正整数n(2n1000000)n(2≤n≤1000000) ,表示字符串SS 的长度。

第二行包含一个长度为nn 的小写字符串SS 。

Output

对于每组数据,输出一行n1n−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;
}
 

猜你喜欢

转载自www.cnblogs.com/RootVount/p/10887090.html