社区讨论

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 条回复,欢迎继续交流。

正在加载回复...