这题的数据输出有什么特别的地方吗?用正解拍极限数据拍了半小时没一点错,交上去直接就WA掉了
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=50005;
const int inf=0x3f3f3f3f;
int n,T,m,sa[maxn],ans,ht[maxn];
int rk[maxn],tp[maxn],tax[maxn];
int st[maxn][22],Log[maxn];
char s[maxn];
inline void Qsort()
{
for(register int i=1;i<=m;++i)tax[i]=0;
for(register int i=1;i<=n;++i)++tax[rk[i]];
for(register int i=1;i<=m;++i)tax[i]+=tax[i-1];
for(register int i=n;i;--i)sa[tax[rk[tp[i]]]--]=tp[i];
}
inline void suffix()
{
for(register int i=1;i<=n;++i)rk[i]=s[i]-'a'+1,tp[i]=i;
Qsort();
for(register int p=0,w=1;p<n;m=p,w<<=1)
{
p=0;
for(register int i=1;i<=w;++i)tp[++p]=n-w+i;
for(register int i=1;i<=n;++i)if(sa[i]>w)tp[++p]=sa[i]-w;
Qsort();
for(register int i=1;i<=n;++i)tp[i]=rk[i];
rk[sa[1]]=p=1;
for(register int i=2;i<=n;++i)rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w])?p:++p;
}
for(register int k=0,i=1;i<=n;++i)
{
if(k)--k;
while(s[i+k]==s[sa[rk[i]-1]+k])++k;
ht[rk[i]]=k;
}
}
inline void pre()
{
Log[0]=-1;
for(register int i=1;i<=n;++i)st[i][0]=ht[i],Log[i]=Log[i/2]+1;
for(register int j=1;j<=20;++j)
for(register int i=1;i<=n&&i+(1<<j)<=n;++i)
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
inline int getmin(int l,int r)
{
if(l==r)return inf;
if(l>r)swap(l,r);
++l;
int k=Log[r-l+1];
return min(st[l][k],st[r-(1<<k)+1][k]);
}
inline void solve(int len)
{
for(register int i=1;i+len<=n;i+=len)
{
int k=getmin(rk[i],rk[i+len]);
int res=k/len+1;
int t=i-len+k%len;
if(getmin(rk[t],rk[t+len])>k)++res;
ans=max(ans,res);
}
}
signed main(void)
{
cin>>T;
while(T--)
{
m=2,ans=0;
cin>>n;
for(register int i=1;i<=n;++i)scanf("\n%c",&s[i]);
suffix();
pre();
for(register int len=1;len<=n;++len)solve(len);
printf("%d",ans);
}
return 0;
}
/*
babba baaba abaabab
*/
数据生成
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
#include<windows.h>
using namespace std;
template <typename T> T random(T s,T t);
typedef long long ll;
typedef unsigned long long ull;
int n,T;
template<typename T> T random(T s,T t)//生成[s,t]之间的数
{
if (s>t)swap(s,t);
return floor((rand()/(double)RAND_MAX)*(t-s+0.5)+s);
}
int main()
{
srand(time(NULL));
printf("1\n");
printf("%d\n",n=50000);
for(register int i=1;i<=n;++i)
{
if(random(1,2)==1)printf("a\n");
else printf("b\n");
}
return 0;
}
求大佬指出本题奇怪之处,或者给一组hack数据(