一、题目描述:
给你一个长度为
二、解题思路:
板子题,我就不写思路了。我用的是
三、完整代码:
1 #include<iostream> 2 #define N 1000010 3 using namespace std; 4 string s; 5 int n,p,m=122,sa[N],rak[N],tp[N]; 6 struct ST{ 7 int l,r,id; 8 bool operator != (const ST &d)const{ 9 if(d.l!=l) return 1; 10 if(d.r!=r) return 1; 11 return 0; 12 } 13 }q[N],h[N]; 14 void qsort() 15 { 16 for(int i=0;i<=m;i++) tp[i]=0; 17 for(int i=1;i<=n;i++) tp[q[i].r]++; 18 for(int i=1;i<=m;i++) tp[i]+=tp[i-1]; 19 for(int i=n;i>=1;i--) h[tp[q[i].r]--]=q[i]; 20 for(int i=0;i<=m;i++) tp[i]=0; 21 for(int i=1;i<=n;i++) tp[h[i].l]++; 22 for(int i=1;i<=m;i++) tp[i]+=tp[i-1]; 23 for(int i=n;i>=1;i--) q[tp[h[i].l]--]=h[i]; 24 } 25 void suffixsort() 26 { 27 for(int i=1;i<=n;i++) 28 rak[i]=s[i-1]; 29 for(int i=1;i;i<<=1,m=p) 30 { 31 for(int j=1;j<=n;j++) 32 { 33 q[j].id=j; 34 q[j].l=rak[j]; 35 if(j+i>n) q[j].r=0; 36 else q[j].r=rak[j+i]; 37 } 38 qsort(); p=0; 39 for(int j=1;j<=n;j++) 40 { 41 p+=q[j]!=q[j-1]; 42 rak[q[j].id]=p; 43 } 44 if(p==n) break; 45 } 46 for(int i=1;i<=n;i++) 47 sa[rak[i]]=i; 48 for(int i=1;i<=n;i++) 49 cout<<sa[i]<<" "; 50 } 51 int main() 52 { 53 ios::sync_with_stdio(false); 54 cin.tie(0);cout.tie(0); 55 cin>>s; 56 n=s.length(); 57 suffixsort(); 58 return 0; 59 }
四、写题心得:
啊!!!终于过了这个题。虽然说早就过了但是当时
不过我把思路都是理顺了的,今天用自己的代码写出来了,也把细节都弄清楚了,简直太爽了!
虽然跟教练的标程比起来常数略大,但
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!