请问为什么会t啊
  • 板块灌水区
  • 楼主bijhla
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/20 16:20
  • 上次更新2024/8/20 18:32:55
查看原帖
请问为什么会t啊
708102
bijhla楼主2024/8/20 16:20

题

我朋友和我写法一样,他过了我没有(都用的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;
}
2024/8/20 16:20
加载中...