见后缀数组后暴力就好了
考前练版子,竟然WA了几发
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
inline void read(char *s)
{
char c=nc(); int len=0;
for (;c!='0' && c!='1';c=nc());
for (;c=='1' || c=='0';s[++len]=c,c=nc()); s[++len]=0;
}
const int N=3005;
int n;
char S[N];
int rank[N],sa[N],height[N];
int t1[N],t2[N],c[N];
inline void SA(int m)
{
int *x=t1,*y=t2;
for (int i=0;i<=m;i++) c[i]=0;
for (int i=1;i<=n;i++) c[x[i]=S[i]-'0'+1]++;
for (int i=1;i<=m;i++) c[i]+=c[i-1];
for (int i=n;i;i--) sa[c[x[i]]--]=i;
for (int k=1;k<=n;k<<=1)
{
int p=0;
for (int i=n-k+1;i<=n;i++) y[++p]=i;
for (int i=1;i<=n;i++) if (sa[i]>k) y[++p]=sa[i]-k;
for (int i=0;i<=m;i++) c[i]=0;
for (int i=1;i<=n;i++) c[x[y[i]]]++;
for (int i=1;i<=m;i++) c[i]+=c[i-1];
for (int i=n;i;i--) sa[c[x[y[i]]]--]=y[i];
swap(x,y);
x[sa[1]]=p=1;
for (int i=2;i<=n;i++)
x[sa[i]]=(y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k])?p:++p;
if (p>=n) break;
m=p;
}
}
inline void Height()
{
int j,k=0;
for (int i=1;i<=n;i++) rank[sa[i]]=i;
for (int i=1;i<=n;height[rank[i++]]=k)
for (k?k--:0,j=sa[rank[i]-1];S[i+k]==S[j+k];k++);
}
//int l[N],r[N];
//int Stk[N],pnt;
int b[N],tot;
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(S);
SA(2); Height();
/*height[1]=height[n+1]=-1<<30;
pnt=0; Stk[++pnt]=1;
for (int i=2;i<=n;i++)
{
while (pnt && height[Stk[pnt]]>=height[i]) Stk[pnt--]=0;
l[i]=Stk[pnt]+1; Stk[++pnt]=i;
}
pnt=0; Stk[++pnt]=n+1;
for (int i=n;i>=2;i--)
{
while (pnt && height[Stk[pnt]]>=height[i]) Stk[pnt--]=0;
r[i]=Stk[pnt]-1; Stk[++pnt]=i;
}*/
for (int i=1;i<n;i++)
{
int k=i+1; tot=0;
for (int j=n-sa[i]+1;j>height[i];j--)
{
while(height[k]>=j) k++;
if(k!=i+1) b[++tot]=k-i;
}
for (int j=tot;j;j--)
printf("%d\n",b[j]);
}
return 0;
}