本题我直接用 string 按顺序得到每个子串,然后再用string 自动比较的性质直接跑 LIS 可是只有过了4个点,往后就 WA 了,不止什么原因
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int B=1e6+10;
string s[B];
string a;
int cnt;
int T;
int read() {int x;scanf("%d",&x);return x;}
int n;
int f[B];
void solve()
{
n=read();
cin>>a;
cnt=0;
for (int i=1;i<=B/10;i++) f[i]=1;
for (int i=0;i<n;i++)
{
for (int j=i;j<n;j++)
{
s[++cnt]=a.substr(i,j-i+1);
// cout<<s[cnt]<<endl;
}
}
f[1]=1;
for (int i=1;i<=cnt;i++)
{
for (int j=1;j<i;j++)
{
if (s[j]<=s[i])
{
f[i]=max(f[i],f[j]+1);
}
}
}
int ans=1;
for (int i=1;i<=cnt;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
}
int main()
{
T=read();
while (T--) solve();
}
/*
1
6
sparky
*/