SAM0分求助,样例过了
查看原帖
SAM0分求助,样例过了
1251722
quantum_MilkyWay楼主2024/5/22 18:33

全WA

#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
const int N = 1e6 + 5;
ll sz, lt;
struct SAM
{
	ll son[26];
	ll fa;
	ll len;
}sam[N * 2];
ll ans;
void newn(ll lens)
{
	sam[++sz].len = lens;
	sam[sz].fa = -1;
	memset(sam[sz].son, 0, sizeof(sam[sz].son));
}
void ins(ll c)
{
	newn(sam[lt].len + 1);
	ll p = lt;
	ll cur = sz;
	while (p != -1 && !sam[p].son[c])
	{
		sam[p].son[c] = cur;
		p = sam[p].fa;
	}
	if (p == -1)sam[cur].fa = 0;
	else
	{
		ll q = sam[p].son[c];
		if (sam[q].len == sam[p].len + 1)sam[cur].fa = q;
		else
		{
			newn(sam[q].len + 1);
			ll nq = sz;
			memcpy(sam[nq].son, sam[q].son, sizeof(sam[q].son));
			sam[nq].fa = sam[q].fa;
			sam[cur].fa = sam[q].fa = nq;
			while (p >= 0 && sam[p].son[c] == q)
			{
				sam[p].son[c] = nq;
				p = sam[p].fa;
			}
		}
	}
	lt = cur;
	ans += sam[cur].len - sam[sam[cur].fa].len;
}
int main()
{
	ll n;
	string s;
	cin >> n >> s;
	sz = -1;
	lt = 0;
	newn(0);
	for (int i = 0; i < s.size(); i++)ins(s[i] - 'a');
	cout << ans;

	return 0;
}
2024/5/22 18:33
加载中...