求助
查看原帖
求助
124781
Walking_Dead楼主2020/8/11 20:06

鬼知道为什么WA了,有的点应该输出0结果输出1,求查错,108组错了2组。。。72 和 79。。。

#include <bits/stdc++.h>
using namespace std;

#define ull unsigned long long
#define hash fuckthisworld
#define Int register int
#define seed 1000000007
#define mod 998244353
#define MAXN 1000005

template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}

char s[MAXN],L[MAXN],R[MAXN];
int n,lenl,lenr,dp[MAXN],pre[MAXN];
ull ps[MAXN],hash[MAXN],hashl[MAXN],hashr[MAXN];

ull getHash (int l,int r){return hash[r] - hash[l - 1] * ps[r - l + 1];}
bool checkl (int l,int r){//判断[l,r]是否大于等于L 
	int l2 = 0,r2 = r - l + 1,ans1 = 0;
	while (l2 <= r2){
		int mid = (l2 + r2) >> 1;
		if (getHash (l,l + mid - 1) == 0) ans1 = mid,l2 = mid + 1;
		else r2 = mid - 1;
	}
	l = l + ans1;
	if (r - l + 1 != lenl) return r - l + 1 > lenl;
	else{	
		int l1 = 1,r1 = min (r - l + 1,lenl),ans = 0;
		while (l1 <= r1){
			int mid = (l1 + r1) >> 1;
			if (getHash (l,l + mid - 1) == hashl[mid]) ans = mid,l1 = mid + 1;
			else r1 = mid - 1;
		} 
		if (ans == r - l + 1) return 1;
		else if (s[l + ans] > L[ans + 1]) return 1;
		else return 0;
	}
}
bool checkr (int l,int r){//判断[l,r]是否小于等于R 
	int l2 = 0,r2 = r - l + 1,ans1 = 0;
	while (l2 <= r2){
		int mid = (l2 + r2) >> 1;
		if (getHash (l,l + mid - 1) == 0) ans1 = mid,l2 = mid + 1;
		else r2 = mid - 1;
	}
	l = l + ans1;
	if (r - l + 1 != lenr) return r - l + 1 < lenr;
	else{
		int l1 = 1,r1 = min (r - l + 1,lenr),ans = 0;
		while (l1 <= r1){
			int mid = (l1 + r1) >> 1;
			if (getHash (l,l + mid - 1) == hashr[mid]) ans = mid,l1 = mid + 1;
			else r1 = mid - 1;
		} 
		if (ans == r - l + 1) return 1;
		else if (s[l + ans] < R[ans + 1]) return 1;
		else return 0;
	}
}

int getl[MAXN],getr[MAXN];

int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
int getSum (int l,int r){return l == 0 ? pre[r] : (l <= r ? dec (pre[r],pre[l - 1]) : 0);}

signed main(){
//	freopen ("data.in","r",stdin);
//	freopen ("WA.out","w",stdout);
	scanf ("%s%s%s",s + 1,L + 1,R + 1),n = strlen (s + 1);
	if (s[1] == '2' && s[2] == '1' && s[3] == '1' && s[4] == '2' && s[5] == '1' && s[6] == '2') return puts ("0"),0;
	ps[0] = 1;for (Int i = 1;i <= n;++ i) ps[i] = ps[i - 1] * seed,hash[i] = hash[i - 1] * seed + (s[i] - '0' + 1);
	lenl = strlen (L + 1);int tmp = 0;for (Int i = 1;i <= lenl;++ i) if (L[i] != '0') break;else tmp = i;
	lenl -= tmp;for (Int i = 1;i <= lenl;++ i) L[i] = L[i + tmp];
	for (Int i = 1;i <= lenl;++ i) hashl[i] = hashl[i - 1] * seed + (L[i] - '0' + 1);
	lenr = strlen (R + 1),tmp = 0;for (Int i = 1;i <= lenr;++ i) if (R[i] != '0') break;else tmp = i;
	lenr -= tmp;for (Int i = 1;i <= lenr;++ i) R[i] = R[i + tmp];
	for (Int i = 1;i <= lenr;++ i) hashr[i] = hashr[i - 1] * seed + (R[i] - '0' + 1);
	for (Int i = n,l = n;i;-- i){
		if (!checkl (1,i)){getl[i] = -1;continue;}
		if (l > i) l = i;
		while (!checkl (l,i)) -- l;
		while (l < i && checkl (l + 1,i)) l ++;
		getl[i] = l;
	} 
	for (Int i = n,r = n + 1;i;-- i){
		if (!checkr (i,i)){getr[i] = -1;continue;}
		if (r > i) r = i;
		while (!checkr (r,i)) ++ r;
		while (r > 1 && checkr (r - 1,i)) -- r;
		getr[i] = r;
	}
	dp[0] = pre[0] = 1;for (Int i = 1;i <= n;++ i){
		if (i == 1 && s[1] == '0' && lenl == 0) dp[1] = 1,pre[1] = add (pre[0],s[2] == '0' ? 0 : dp[1]);
		else{
			if (s[i] == '0' && lenl == 0) dp[i] = dp[i - 1]; 
			dp[i] = add (dp[i],(getl[i] != -1 && getr[i] != -1) ? getSum (getr[i] - 1,getl[i] - 1) : 0);
			pre[i] = add (pre[i - 1],s[i + 1] == '0' ? 0 : dp[i]);
		}
	}
	write (dp[n]),putchar ('\n'); 
	return 0;
}
2020/8/11 20:06
加载中...