社区讨论

有无老哥知道这题 WA 13 是咋回事啊

CF1393E2 Twilight and Ancient Scroll (harder version)参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lockb37y
此快照首次捕获于
2023/10/30 15:12
2 年前
此快照最后确认于
2023/11/05 02:26
2 年前
查看原帖
RT,我的思博代码挂在 #13 了,看了一下挂在这个点的人不多啊...
有无人知道为啥 WA 啊qwq
这是我代码,不过这题因为代码会很长所以不建议没挂过 #13 的老哥帮我 debug(太浪费时间了
CPP
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n , sum[110000] , srk[110000] , rk[2100000] , noww , ans , l , r;
int lcp[2100000] , lcp1[2100000] , lcp2[2100000] , nex[2100000];
long long dp[2100000] , ss[2100000] , val[2100000];
const int mod = 1e9 + 7;
string s[110000];
bool check( int pl1 , int pl2 )
{
	int u = lcp[sum[noww - 1]];
	if(u < min(pl1 , pl2)) return s[noww][u] <= s[noww + 1][u];
	if(pl1 < pl2)
	{
		u = pl1 + lcp2[sum[noww - 1] + pl1 + 1] + 1;
		if(u <= pl2) return s[noww][u] <= s[noww + 1][u - 1];
	}
	else
	{
		u = pl2 + lcp1[sum[noww - 1] + pl2];
		if(u < pl1) return s[noww][u] <= s[noww + 1][u + 1];
	}
	u = max(pl1 , pl2) + 1 + lcp[sum[noww - 1] + max(pl1 , pl2) + 1];
	if(u <= min(s[noww + 1].size() , s[noww].size()) - 1) return s[noww][u] <= s[noww + 1][u];
	return 1;
}
void binary( int l , int r , int pl )
{
	if(l > r) return ;
	int mid = l + r >> 1;
//	cerr << l << ' ' << r << ' ' << mid << ' ' << rk[mid] << ' ';
	if(check(rk[mid] , pl))
	{
//		cerr << 1 << endl;
		ans = mid;
		binary(mid + 1 , r , pl);
	}
	else
	{
//		cerr << 0 << endl;
		binary(l , mid - 1 , pl);
	}
	return ;
}
int main()
{
//	freopen("1.in" , "r" , stdin);
//	freopen("1.out" , "w" , stdout);
	scanf("%d" , &n);
	for(int i = 1 ; i <= n ; i++ ) 
	{
		cin >> s[i] , s[i] += '$';
		sum[i] = sum[i - 1] + s[i].size();
	}
	for(int i = 1 ; i < n ; i++ )
	{
		for(int j = min(s[i].size() - 1 , s[i + 1].size() - 1) ; j >= 0 ; j-- )
			lcp[sum[i - 1] + j] = (s[i][j] == s[i + 1][j] ? lcp[sum[i - 1] + j + 1] + 1 : 0);
		for(int j = min(s[i].size() - 1 , s[i + 1].size() - 2) ; j >= 0 ; j-- )
			lcp1[sum[i - 1] + j] = (s[i][j] == s[i + 1][j + 1] ? lcp1[sum[i - 1] + j + 1] + 1 : 0);
		for(int j = min(s[i].size() - 1 , s[i + 1].size()) ; j >= 1 ; j-- )
			lcp2[sum[i - 1] + j] = (s[i][j] == s[i + 1][j - 1] ? lcp2[sum[i - 1] + j + 1] + 1 : 0);
//		for(int j = 1 ; j < min(s[i].size() , s[i + 1].size() + 1) ; j++ )
//			cerr << lcp2[sum[i - 1] + j] << ' ';
//		cerr << endl;
	}
	for(int i = 1 ; i <= n ; i++ )
	{
		for(int j = s[i].size() - 2 ; j >= 0 ; j-- )
			nex[sum[i - 1] + j] = (s[i][j] == s[i][j + 1] ? nex[sum[i - 1] + j + 1] : j + 1);
		nex[sum[i] - 1] = s[i].size();
//		for(int j = 0 ; j <= s[i].size() - 2 ; j++ ) cerr << nex[sum[i - 1] + j] << ' '; cerr << endl;
	}
	
	for(int i = 1 ; i <= n ; i++ )
	{
		srk[i] = srk[i - 1];
		for(int j = 0 ; j < s[i].size() ; j = nex[sum[i - 1] + j] ) srk[i]++;
		l = srk[i - 1] + 1 , r = srk[i];
		for(int j = 0 ; j < s[i].size() ; j = nex[sum[i - 1] + j] )
		{
			if(s[i][j] < s[i][nex[sum[i - 1] + j]]) 
			{
				rk[r] = nex[sum[i - 1] + j] - 1; 
				val[r] = nex[sum[i - 1] + j] - j; r--;
			}
			else
			{
				rk[l] = nex[sum[i - 1] + j] - 1; 
				val[l] = nex[sum[i - 1] + j] - j; l++;
			} 
		}
	}
	
//	for(int i = 1 ; i <= n ; i++ ) 
//	{
//		for(int j = srk[i - 1] + 1 ; j <= srk[i] ; j++ ) cerr << rk[j] << ' ';
//		cerr << endl;
//	}
//	cerr << endl;
//	for(int i = 1 ; i <= n ; i++ ) 
//	{
//		for(int j = srk[i - 1] + 1 ; j <= srk[i] ; j++ ) cerr << val[j] << ' ';
//		cerr << endl;
//	}
//	cerr << endl;
	
	for(int i = 1 ; i <= srk[1] ; i++ ) ss[i] = ss[i - 1] + val[i];
	for(int i = 2 ; i <= n ; i++ )
	{
		noww = i - 1;
		for(int j = srk[i - 1] + 1 ; j <= srk[i] ; j++ )
		{
			ans = -1;
			binary(srk[i - 2] + 1 , srk[i - 1] , rk[j]);
//			cerr << ans - srk[i - 2] << ' ';
			if(~ans) dp[j] = val[j] * ss[ans] % mod;
		}
//		cerr << endl;
		ss[srk[i - 1] + 1] = dp[srk[i - 1] + 1]; 
		for(int j = srk[i - 1] + 2 ; j <= srk[i] ; j++ ) ss[j] = (dp[j] + ss[j - 1]) % mod;
//		for(int j = srk[i - 1] + 1 ; j <= srk[i] ; j++ ) cerr << dp[j] << ' '; cerr << endl;
	}
	printf("%lld" , ss[srk[n]]);
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...