社区讨论
RE on #38 求助
CF1051EVasya and Big Integers参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mk672ap2
- 此快照首次捕获于
- 2026/01/09 09:25 上个月
- 此快照最后确认于
- 2026/01/09 15:00 上个月
CPP
/* ChongYun */
#include<bits/stdc++.h>
#define File(s,t) freopen(s".in","r",stdin),freopen(t".out","w",stdout)
#define Time() cerr<<fixed<<setprecision(6)<<1.*(double)(clock()-__st)/CLOCKS_PER_SEC<<"s\n"
#define Memory() cerr<<fixed<<setprecision(6)<<1.*fabs(&__t-&__s)/1024./1024.<<"MB\n"
char __s; clock_t __st;
#define int long long
#define ldb long double
#define ull unsigned long long
#define reg register
using namespace std;
#define pii pair<int,int>
#define fir first
#define sec second
#define _LIMIT(x) (x>='0'&&x<='9')
#define flush() fwrite(obuf,1,O-obuf,stdout)
#define putchar(x) ((O==obuf+(1<<21))&&(flush(),O=obuf)),*O++=x
char buf[1<<23],*P1=buf,*P2=buf,obuf[1<<23],*O=obuf;
#define getchar() (P1==P2&&(P2=(P1=buf)+fread(buf,1,1<<21,stdin),P1==P2)?EOF:*P1++)
inline char gc(){ reg char ch=getchar();while(!_LIMIT(ch))ch=getchar();return ch; }
inline int read(){
reg int x=0,f=1;
reg char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1;ch=getchar(); }
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
return x*f;
}
inline int read(string &s){
s=""; reg char ch=getchar();
while(!_LIMIT(ch)) ch=getchar();
while(_LIMIT(ch)) s+=ch,ch=getchar();
return (int)s.size();
}
inline void write(int x){
if(x<0) x=-x,putchar('-');
if(x>9) write(x/10);
putchar((x%10)^48);
}
inline void write(int x,char ch){ write(x),putchar(ch); }
inline void write(string s){ for(reg int i=0;i<(int)s.size();++i) putchar(s[i]); }
struct Flush{ ~Flush(){ flush(); } }_;
const int N=4e6+5,mod=998244353;
string s,t0,t1;
int n,m0,m1,dp[N],sum[N],z0[N],z1[N],p0[N],p1[N];
bool f(int i){ return (p0[i-m0+1]>=m0||s[i-m0+p0[i-m0+1]+1]>t0[p0[i-m0+1]+1]); }
bool g(int i){ return (p1[i-m1+1]>=m1||s[i-m1+p1[i-m1+1]+1]<t1[p1[i-m1+1]+1]); }
int query(int l,int r){ return (r>=0?sum[r]:0)-(l>0?sum[l-1]:0); }
namespace Tracy{
void Main(){
n=read(s),m0=read(t0),m1=read(t1);
s=' '+s,t0=' '+t0,t1=' '+t1;
z0[1]=m0,z1[1]=m1;
for(int i=2,r=0,j=0;i<=m0;++i){
z0[i]=(i<=r?min(z0[i-j+1],r-i+1):0);
while(i+z0[i]<=m0&&t0[z0[i]+1]==t0[i+z0[i]]) ++z0[i];
if(i+z0[i]-1>r) r=i+z0[i]-1,j=i;
}
for(int i=2,r=0,j=0;i<=m1;++i){
z1[i]=(i<=r?min(z1[i-j+1],r-i+1):0);
while(i+z1[i]<=m1&&t1[z1[i]+1]==t1[i+z1[i]]) ++z1[i];
if(i+z1[i]-1>r) r=i+z1[i]-1,j=i;
}
for(int i=1,r=0,j=0;i<=n;++i){
p0[i]=(i<=r?min(z0[i-j+1],r-i+1):0);
while(i+p0[i]<=n&&t0[p0[i]+1]==s[i+p0[i]]) ++p0[i];
if(i+p0[i]-1>r) r=i+p0[i]-1,j=i;
}
for(int i=1,r=0,j=0;i<=n;++i){
p1[i]=(i<=r?min(z1[i-j+1],r-i+1):0);
while(i+p1[i]<=n&&t1[p1[i]+1]==s[i+p1[i]]) ++p1[i];
if(i+p1[i]-1>r) r=i+p1[i]-1,j=i;
}
dp[0]=sum[0]=1;
for(int i=1;i<=n;++i){
if(m0+1<=m1-1) dp[i]=(query(i-m1+1,i-m0-1)+mod)%mod;
if(m0==m1){ if(f(i)&&g(i)&&(m0==1||s[i-m0+1]!='0')) dp[i]=(dp[i]+dp[i-m0])%mod; }
else{
if(f(i)&&(m0==1||s[i-m0+1]!='0')) dp[i]=(dp[i]+dp[i-m0])%mod;
if(g(i)&&(m1==1||s[i-m1+1]!='0')) dp[i]=(dp[i]+dp[i-m1])%mod;
}
sum[i]=(sum[i-1]+(s[i+1]=='0'?0:dp[i]))%mod;
}
write(dp[n],'\n');
}
char __t;
int Reznik(int T=1){
__st=clock();
while(T--) Main();
return /*Time(),Memory(),*/0;
}
}
signed main(){
// File("","");
return Tracy::Reznik();
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...