《 Codeforces Round #122 (Div. 1) B》
首先可以状压所有方案,但是这样复杂度O(2 ^ u * n)。
考虑到连续的xor操作其实可以整合到一起,那么可以再次优化。
然后我们考虑dfs,理论上来说dfs每层都有两种操作应该是2 ^ u * n。
但是因为连续的异或操作是没有意义的,所有我们就可以明白了除非是进行1的xor操作,否则进行和不进行都是一样的。
那么就有了如果上一层进行过异或操作之后,那么这一层就不能再异或了。
这样一来30层里最多也只有15层的xor | +r。这样复杂度估计也就2 ^ 20之内。那么就够了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 1e6 + 5; const int M = 1e7 + 5; const LL Mod = 998244353; #define rep(at,am,as) for(int at = am;at <= as;++at) #define INF 1e18 #define dbg(ax) cout << "now this num is " << ax << endl; inline long long ADD(long long x,long long y) { if(x + y < 0) return ((x + y) % Mod + Mod) % Mod; return (x + y) % Mod; } inline long long MUL(long long x,long long y) { if(x * y < 0) return ((x * y) % Mod + Mod) % Mod; return x * y % Mod; } inline long long DEC(long long x,long long y) { if(x - y < 0) return (x - y + Mod) % Mod; return (x - y) % Mod; } int n,u,r,a[35],b[35],k[35],p[35],ans[35][35]; LL mx = -INF; void dfs(int x,int tag) { if(x % 2 == u % 2) { LL tmp = 0; rep(i,1,n) tmp += 1LL * ans[x][i] * k[i]; mx = max(mx,tmp); } if(x == u) return ; rep(i,1,n) ans[x + 1][i] = ans[x][p[i]] + r; dfs(x + 1,1); if(tag == 1) { rep(i,1,n) ans[x + 1][i] = ans[x][i] ^ b[i]; dfs(x + 1,0); } } void solve() { cin >> n >> u >> r; rep(i,1,n) cin >> a[i]; rep(i,1,n) cin >> b[i]; rep(i,1,n) cin >> k[i]; rep(i,1,n) cin >> p[i],ans[0][i] = a[i]; dfs(0,1); printf("%lld\n",mx); } int main() { // int _; // for(scanf("%d",&_);_;_--) { solve(); //} // system("pause"); return 0; }