SA-IS后缀数组 HDU - 6294

本文介绍了一个算法问题,即如何通过比较字符串后缀的字典序来确定其大小关系。具体而言,对于给定的小写字符串,程序需要判断每一对相邻后缀之间的字典序大小关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小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+1sufi<sufi+1,输出<<,否则输出>>,显然不存在相等关系。
Sample Input
1
17
quailtyacmbestacm
Sample Output
<><<<<><<><<<><<

#include <iostream>
#include<algorithm>
#include<iomanip>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
	int t, n;
	cin >> t;
	while (t--)
	{
		cin >> n;
		char a[1000005];
		cin >> a;
		int len = strlen(a);
		int k = 1;
		for (int i = 0; i < len-1; i++)
		{
			if (a[i] > a[i + 1])
			{
				while(k--)cout << ">";
				k = 1;
			}
			else if (a[i] < a[i + 1])
			{
				while (k--)cout << "<";
				k = 1;
			}
			else k++;
		}
		while (--k)
		{
			cout << ">";
		}
		cout << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值