当前位置:   article > 正文

HDU - 6294 SA-IS后缀数组(思维)(2018CCPC女生赛)_后缀自动机sa-is

后缀自动机sa-is

SA-IS后缀数组

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 226    Accepted Submission(s): 75


Problem Description
小Q最近阅读了SA-IS算法在线性时间内构造后缀数组的相关论文,面对任何字符串题,都可以想出线性时间的算法。

小T在经历过二分图匹配事件后,再也不相信小Q所说的话。面对小Q,小T又给出了一道字符串题:

给定一个长度为 的小写字符串 ,设 表示以  为开始的后缀,即

为字符串 的长度,对于两个字符串 ,定义 的字典序比 小,当且仅当存在非负整数 使得 的前 个字符与 的前  个字符对应相同,并且要么满足 ,要么满足 的第 个字符比 的第 个字符小。例如aa的字典序比aaa小,ab的字典序比ba小。

请对每个 ,判断 的字典序大小关系。

只会吹牛的小Q又不会做了,所以他再一次向你紧急求助。请写一个程序,判断相邻两个后缀的大小关系。
 

Input
第一行包含一个正整数 ,表示测试数据的组数。

每组数据第一行包含一个正整数 ,表示字符串 的长度。

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

Output
对于每组数据,输出一行 个字符,第 个字符表示 的大小关系,若 ,输出 ,否则输出 ,显然不存在相等关系。
 

Sample Input
 
 
1 17 quailtyacmbestacm
 

Sample Output
 
 
<><<<<><<><<<><<
 

Source
 


解题思路:贪心从前往后扫,可以直接记录答案。关键在于处理相等的情况。实际上,相等的情况可以从后往前推出。


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int ll;
  4. char str[1000005];
  5. char ans[1000005];
  6. int main(){
  7. int T;
  8. scanf("%d",&T);
  9. for(int qqq=1;qqq<=T;qqq++){
  10. memset(ans,0,sizeof(ans));
  11. int N;
  12. scanf("%d",&N);
  13. scanf("%s",str);
  14. for(int i=0;i<N;i++){
  15. if(str[i]<str[i+1]){
  16. ans[i]='<';
  17. }
  18. else{
  19. if(str[i]>str[i+1]){
  20. ans[i]='>';
  21. }
  22. }
  23. }
  24. char cur=ans[N-1];
  25. for(int i=N-2;i>=0;i--){
  26. if(ans[i]==0)
  27. ans[i]=cur;
  28. else{
  29. cur=ans[i];
  30. }
  31. }
  32. ans[N-1]='\0';
  33. printf("%s\n",ans);
  34. }
  35. return 0;
  36. }








声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/443315
推荐阅读
相关标签
  

闽ICP备14008679号