关于我第一个样例过不了却ac了这件事
查看原帖
关于我第一个样例过不了却ac了这件事
355377
xiaozhuo楼主2023/8/25 14:02
#include<bits/stdc++.h>
using namespace std;
#define M 100010
char s[M];
int sa[M], x[M], y[M], c[M], n, m, ra[M], height[M];
long long ans = 0;
void getsa()
{
	memset(c, 0, sizeof(c));
	for(int i = 1;i <= n;i ++) c[x[i] = s[i] - 'a'] ++;
	for(int i = 1;i <= m;i ++) c[i] += c[i - 1];
	for(int i = n;i >= 1;i --) sa[c[x[i]] --] = i;
	for(int k = 1;k <= n;k <<= 1)
	{
		int p = 1;
		for(int i = n - k + 1;i <= n;i ++) y[p ++] = i;
		for(int i = 1;i <= n;i ++) if(sa[i] > k) y[p ++] = sa[i] - k;
		
		memset(c, 0, sizeof(c));
		for(int i = 1;i <= n;i ++) c[x[i]] ++;
		for(int i = 1;i <= m;i ++) c[i] += c[i - 1];
		for(int i = n;i >= 1;i --) sa[c[x[y[i]]] --] = y[i];
		
		swap(x, y);
		p = 1;
		x[sa[1]] = 1;
		for(int i = 2;i <= n;i ++) x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? p : ++p;
		if(p == n) break;
		m = p;
	}
}
void getheight()
{
	for(int i = 1;i <= n;i ++) ra[sa[i]] = i;
	int j = 0;
	for(int i = 1;i <= n;i ++)
	{
		if(ra[i] == 1) continue;
		if(j) j --;
		int l = sa[ra[i] - 1];
		while(s[l + j] == s[i + j] && l + j <= n && i + j <= n) j ++;
		height[ra[i]] = j;
	}
}
int main()
{
	cin >> n; 
	cin >> s + 1;
	m = 25;
	getsa(), getheight();
	for(int i = 1;i <= n;i ++) ans += n - sa[i] + 1 - height[i];
	cout << ans;
	return 0;
}
2023/8/25 14:02
加载中...