1 条题解
-
1
这题不知道为什么洛谷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
- 上传者