我朋友和我写法一样,他过了我没有(都用的substr,和这个无关)他帮我调了好久都没过
#include<bits/stdc++.h>
#define PSI pair<string,int>
#define ll long long
#define MP make_pair
#define PB push_back
using namespace std;
constexpr int N = 3e3 + 10;
int n, rnk[N], ans[N], l[N], r[N], p[N];
vector <PSI> g;
string s;
stack <int> st;
bool cmp (PSI x, PSI y)
{
if (x.first != y.first) return x.first < y.first;
return x.second < y.second;
}
int main ()
{
//freopen ("", "r", stdin);
//freopen ("", "w", stdout);
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> s;
s = ' ' + s;
for (int i = 1; i <= n; i++)
{
memset (rnk, 0, sizeof (rnk));
memset (ans, 0, sizeof (ans));
memset (l, 0, sizeof (l));
g.clear ();
for (int j = 1; j + i - 1 <= n; j++) g.PB (MP (s.substr (j, i), j));
sort (g.begin (), g.end (), cmp);
for (int j = 1; j + i - 1 <= n; j++) {rnk[g[j].second] = j, r[j] = n - i + 2;}
while (!st.empty ()) st.pop ();
for (int j = 1; j + i - 1 <= n; j++)
{
while (!st.empty () && rnk[j] < rnk[st.top ()]) st.pop ();
if (!st.empty ()) l[j] = st.top ();
st.push (j);
}
while (!st.empty ()) st.pop ();
for (int j = n + 1 - i; j >= 1; j--)
{
while (!st.empty () && rnk[j] < rnk[st.top ()]) st.pop ();
if (!st.empty ()) r[j] = st.top ();
st.push (j);
}
for (int j = 1; j + i - 1 <= n; j++) ans[i]++, ans[r[j] - l[j] + i - 1]--;
for (int j = i; j <= n; j++) {ans[j] += ans[j - 1]; p[ans[j]]++;}
}
for (int i = 1; i <= n; i++) cout << p[i] << "\n";
return 0;
}