很迷惑
查看原帖
很迷惑
224229
Caicz楼主2020/7/24 07:38

这题的数据输出有什么特别的地方吗?用正解拍极限数据拍了半小时没一点错,交上去直接就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数据(

2020/7/24 07:38
加载中...