1 条题解

  • 1
    @ 2026-3-22 9:20:00

    这题不知道为什么洛谷AC交上去RE
    考虑到数据较大,同时异或的性质,赛时在思考了 30min后得出前缀和+DP的做法。
    但我的做法复杂度有点高了,没有优化。

    赛时60pts代码
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll n,k,ans;
    int a[500001],sum[500001],dp[500001];
    int main(){
    //	freopen("xor.in","r",stdin);
    //	freopen("xor.out","w",stdout);
    	cin>>n>>k>>a[1];
    	sum[1]=a[1];
    	for(int i=2;i<=n;i++){
    		cin>>a[i];
    		sum[i]=a[i]^sum[i-1];
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=i;j++)
    			if((sum[i]^sum[j-1])==k)
    				dp[i]=max(dp[i],dp[j-1]+1);
    		dp[i]=max(dp[i],dp[i-1]);
    	}
    	cout<<dp[n];
    	return 0;
    }
    
    显然,一些优化就能通过此题
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll n,k,sum[5000005],dp[5000005],ans,last;
    int main(){
        cin>>n>>k;
        for(int i=1,x;i<=n;i++){
            cin>>x;
            sum[i]=sum[i-1]^x;
        }
        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        for(int r=1;r<=n;r++){
            ll x=sum[r]^k;
            if(dp[x]>=last){
                ans++;
                last=r;
            }
            dp[sum[r]]=r;
        }
        cout<<ans;
        return 0;
    }
    
    

    信息

    ID
    313
    时间
    1000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    7
    已通过
    1
    上传者