提交记录 11492


用户 题目 状态 得分 用时 内存 语言 代码长度
Fister 1006. 【模板题】后缀排序 Wrong Answer 0 8.299 ms 5112 KB C++ 2.02 KB
提交时间 评测时间
2020-01-18 15:13:39 2020-08-01 02:44:09
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=(j),LIM=(k);i<=LIM;i++)
#define per(i,j,k) for(register int i=(j),LIM=(k);i>=LIM;i--)
#define maxn 100005
#define Ct const
using namespace std;

namespace SA{
	int sa[maxn],h[maxn],rk[maxn],c[maxn],l[maxn],p[maxn],s[maxn<<1],t[maxn<<1];
	#define pushS(x) sa[l[s[x]]--]=x
	#define pushL(x) sa[l[s[x]]++]=x 
	#define _Sort(v) fill(sa,sa+n,-1),fill(c,c+m,0);   							 \
	rep(i,0,n-1) c[s[i]]++;rep(i,1,m-1) c[i]+=c[i-1]; 						 	 \
	rep(i,0,m-1) l[i]=c[i]-1;per(i,n1-1,0) pushS(v[i]);							 \
	rep(i,0,m-1) l[i]=c[i-1];rep(i,0,n-1) if(sa[i]>0&&t[sa[i]-1]) pushL(sa[i]-1);\
	rep(i,0,m-1) l[i]=c[i]-1;per(i,n-1,0) if(sa[i]>0&&!t[sa[i]-1])pushS(sa[i]-1);
	void sais(int n,int m,int *s,int *t,int *p){
		int n1 = t[n-1] = 0 , ch = rk[0] = -1 , *s1 = s+n;
		per(i,n-2,0) t[i]=s[i]^s[i+1]?s[i]>s[i+1]:t[i+1];
		rep(i,1,n-1) rk[i]=t[i-1]&&!t[i]?p[n1]=i,n1++:-1;
		_Sort(p);
		for(int i=0,x,y;i<n;i++) if(~(x=rk[sa[i]])){
			if(ch<0||(p[x+1]-p[x])^(p[y+1]-p[y])) ch++;
			else for(int j=p[x],k=p[y];j<=p[x+1];j++,k++) 
				if((s[j]<<1|t[j])^(s[k]<<1|t[k])){ ch++;break; }
			s1[y=x]=ch;}
		if(ch+1<n1) sais(n1,ch+1,s1,t+n,p+n1);
		else rep(i,0,n1-1) sa[s1[i]]=i;
		rep(i,0,n1-1) s1[i]=p[sa[i]];
		_Sort(s1);
	}
	template<class T>void SA(int n,Ct T &S){
		rep(i,0,n-1) s[i]=S[i];s[n++]=0;
		sais(n,200,s,t,p);
		rep(i,0,n-1) rk[sa[i]]=i;
		for(int i=0,k=0;i<n-1;h[rk[i++]]=k)
			for(k&&k--;s[i+k]==s[sa[rk[i]-1]+k];k++);
	}
}	
using SA::sa;
using SA::h;
using SA::rk;

char output_buffer[maxn * 20], *output_ptr = output_buffer;
void print(int v, char step = ' ')
{
	if (v)
	{
		static int str[20];
		int len = 0;
		for (; v; v /= 10) str[len++] = v % 10;
		while (len--) *output_ptr++ = str[len] + '0';
	}
	else *output_ptr++ = '0';
	*output_ptr++ = step;
}
void flush()
{
	fwrite(output_buffer, 1, output_ptr - output_buffer, stdout);
}

int main(){
	static char s[maxn];
	scanf("%s",s);
	int n = strlen(s);
	SA::SA(n,s);
	rep(i,1,n) print(sa[i]+1," \n"[i==n]);
	rep(i,2,n) print(h[i]," \n"[i==n]);
	flush();
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #138.2 us80 KBWrong AnswerScore: -100

Subtask #1 Testcase #243.36 us80 KBAcceptedScore: 100

Subtask #1 Testcase #343.71 us80 KBAcceptedScore: 0

Subtask #1 Testcase #440.36 us80 KBAcceptedScore: 0

Subtask #1 Testcase #539.72 us80 KBAcceptedScore: 0

Subtask #1 Testcase #639.82 us80 KBAcceptedScore: 0

Subtask #1 Testcase #77.26 ms4 MB + 204 KBAcceptedScore: 0

Subtask #1 Testcase #88.299 ms4 MB + 384 KBAcceptedScore: 0

Subtask #1 Testcase #98.194 ms4 MB + 168 KBAcceptedScore: 0

Subtask #1 Testcase #105.277 ms2 MB + 764 KBAcceptedScore: 0

Subtask #1 Testcase #115.196 ms2 MB + 796 KBAcceptedScore: 0

Subtask #1 Testcase #124.949 ms4 MB + 316 KBAcceptedScore: 0

Subtask #1 Testcase #134.96 ms4 MB + 252 KBAcceptedScore: 0

Subtask #1 Testcase #145.163 ms3 MB + 872 KBAcceptedScore: 0

Subtask #1 Testcase #155.165 ms3 MB + 936 KBAcceptedScore: 0

Subtask #1 Testcase #165.383 ms4 MB + 904 KBAcceptedScore: 0

Subtask #1 Testcase #175.349 ms4 MB + 1016 KBAcceptedScore: 0

Subtask #1 Testcase #185.265 ms4 MB + 988 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2025-06-19 12:00:20 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠