P9512
你需要在 \(q\) 次交互中得到一个长度为 \(n\) 的 01 串 \(S\),每次交互你需要构造一个 \(m\) 个点,每个点各有 01 两条出边的自动机,交互库会告诉你从 0 号点出发按照 \(S\) 转移最终到达的点的编号。
满分限制:\(n=1000,m\le102,q\le1000\)。
Solution
首先考虑 \(m=n+2\) 的做法:从前往后依次求解,对于 \(S_i\),先连 \(i-1\) 条边的链,链尾连向两个点,这两个点连自环。根据最终走到的点可以确定第 \(i\) 步的走向,即 \(S_i\)。
上面这个做法只能获得长度为 \(100\) 的前缀,考虑求解长度为 \(100\) 的后缀:从后往前求解,假设 \(S_i=1\),使用 kmp 自动机进行判断。
然而这两个做法都没什么前途,原因是在已有限制下难以确定中间某个位置,只能考虑从别的方向入手。
考虑这样一个结构:两个点互相连 1 边,向自己连 0 边。这个结构可以获得整个串中 1 的个数奇偶性,或者说是整个串的异或和。
这也启发我们将整个图分成相同两部分,并将其中某个位置的 1 边进行交叉。
考虑连出两个 \(a\) 个点的环,并将其中第 \(b\) 个位置(起点为第 \(1\) 个位置)的 1 边交叉,那么根据最终位置可以确定原串中 \(\{p\mid p\bmod a=b\}\) 这些位置的异或和。
那么只需选取一些合适的 \((a,b)\),将其得到的信息视为异或方程组做消元,写一个代码暴力枚举并使用线性基判断是否与已有的 \((a,b)\) 线性无关即可。然而在 \(n=1000\) 时 \(m\) 的限制不够我们构造出 \(2a\) 个点的自动机。
结合之前提到的两种方法,先问出前后缀的 \(200\) 个,只需对中间 \(800\) 个位置求解。用刚才的代码算一下发现恰好可行,那么就做完了。
使用 bitset 做消元,时间复杂度 \(O(\frac{n^3}{\omega})\)。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define clr clear
using namespace std;
int Query(int m,vector<int>a,vector<int>b);
constexpr int N=1005;
int LIST[N][2]={{},{1,0},{2,0},{3,0},{3,1},{4,0},{4,1},{5,0},{5,1},{5,2},{5,3},{6,0},{6,1},{7,0},{7,1},{7,2},{7,3},{7,4},{7,5},{8,0},{8,1},{8,2},{8,3},{9,0},{9,1},{9,2},{9,3},{9,4},{9,5},{10,0},{10,1},{10,2},{10,3},{11,0},{11,1},{11,2},{11,3},{11,4},{11,5},{11,6},{11,7},{11,8},{11,9},{12,0},{12,1},{12,2},{12,3},{13,0},{13,1},{13,2},{13,3},{13,4},{13,5},{13,6},{13,7},{13,8},{13,9},{13,10},{13,11},{14,0},{14,1},{14,2},{14,3},{14,4},{14,5},{15,0},{15,1},{15,2},{15,3},{15,4},{15,5},{15,6},{15,7},{16,0},{16,1},{16,2},{16,3},{16,4},{16,5},{16,6},{16,7},{17,0},{17,1},{17,2},{17,3},{17,4},{17,5},{17,6},{17,7},{17,8},{17,9},{17,10},{17,11},{17,12},{17,13},{17,14},{17,15},{18,0},{18,1},{18,2},{18,3},{18,4},{18,5},{19,0},{19,1},{19,2},{19,3},{19,4},{19,5},{19,6},{19,7},{19,8},{19,9},{19,10},{19,11},{19,12},{19,13},{19,14},{19,15},{19,16},{19,17},{20,0},{20,1},{20,2},{20,3},{20,4},{20,5},{20,6},{20,7},{21,0},{21,1},{21,2},{21,3},{21,4},{21,5},{21,6},{21,7},{21,8},{21,9},{21,10},{21,11},{22,0},{22,1},{22,2},{22,3},{22,4},{22,5},{22,6},{22,7},{22,8},{22,9},{23,0},{23,1},{23,2},{23,3},{23,4},{23,5},{23,6},{23,7},{23,8},{23,9},{23,10},{23,11},{23,12},{23,13},{23,14},{23,15},{23,16},{23,17},{23,18},{23,19},{23,20},{23,21},{24,0},{24,1},{24,2},{24,3},{24,4},{24,5},{24,6},{24,7},{25,0},{25,1},{25,2},{25,3},{25,4},{25,5},{25,6},{25,7},{25,8},{25,9},{25,10},{25,11},{25,12},{25,13},{25,14},{25,15},{25,16},{25,17},{25,18},{25,19},{26,0},{26,1},{26,2},{26,3},{26,4},{26,5},{26,6},{26,7},{26,8},{26,9},{26,10},{26,11},{27,0},{27,1},{27,2},{27,3},{27,4},{27,5},{27,6},{27,7},{27,8},{27,9},{27,10},{27,11},{27,12},{27,13},{27,14},{27,15},{27,16},{27,17},{28,0},{28,1},{28,2},{28,3},{28,4},{28,5},{28,6},{28,7},{28,8},{28,9},{28,10},{28,11},{29,0},{29,1},{29,2},{29,3},{29,4},{29,5},{29,6},{29,7},{29,8},{29,9},{29,10},{29,11},{29,12},{29,13},{29,14},{29,15},{29,16},{29,17},{29,18},{29,19},{29,20},{29,21},{29,22},{29,23},{29,24},{29,25},{29,26},{29,27},{30,0},{30,1},{30,2},{30,3},{30,4},{30,5},{30,6},{30,7},{31,0},{31,1},{31,2},{31,3},{31,4},{31,5},{31,6},{31,7},{31,8},{31,9},{31,10},{31,11},{31,12},{31,13},{31,14},{31,15},{31,16},{31,17},{31,18},{31,19},{31,20},{31,21},{31,22},{31,23},{31,24},{31,25},{31,26},{31,27},{31,28},{31,29},{32,0},{32,1},{32,2},{32,3},{32,4},{32,5},{32,6},{32,7},{32,8},{32,9},{32,10},{32,11},{32,12},{32,13},{32,14},{32,15},{33,0},{33,1},{33,2},{33,3},{33,4},{33,5},{33,6},{33,7},{33,8},{33,9},{33,10},{33,11},{33,12},{33,13},{33,14},{33,15},{33,16},{33,17},{33,18},{33,19},{34,0},{34,1},{34,2},{34,3},{34,4},{34,5},{34,6},{34,7},{34,8},{34,9},{34,10},{34,11},{34,12},{34,13},{34,14},{34,15},{35,0},{35,1},{35,2},{35,3},{35,4},{35,5},{35,6},{35,7},{35,8},{35,9},{35,10},{35,11},{35,12},{35,13},{35,14},{35,15},{35,16},{35,17},{35,18},{35,19},{35,20},{35,21},{35,22},{35,23},{36,0},{36,1},{36,2},{36,3},{36,4},{36,5},{36,6},{36,7},{36,8},{36,9},{36,10},{36,11},{37,0},{37,1},{37,2},{37,3},{37,4},{37,5},{37,6},{37,7},{37,8},{37,9},{37,10},{37,11},{37,12},{37,13},{37,14},{37,15},{37,16},{37,17},{37,18},{37,19},{37,20},{37,21},{37,22},{37,23},{37,24},{37,25},{37,26},{37,27},{37,28},{37,29},{37,30},{37,31},{37,32},{37,33},{37,34},{37,35},{38,0},{38,1},{38,2},{38,3},{38,4},{38,5},{38,6},{38,7},{38,8},{38,9},{38,10},{38,11},{38,12},{38,13},{38,14},{38,15},{38,16},{38,17},{39,0},{39,1},{39,2},{39,3},{39,4},{39,5},{39,6},{39,7},{39,8},{39,9},{39,10},{39,11},{39,12},{39,13},{39,14},{39,15},{39,16},{39,17},{39,18},{39,19},{39,20},{39,21},{39,22},{39,23},{40,0},{40,1},{40,2},{40,3},{40,4},{40,5},{40,6},{40,7},{40,8},{40,9},{40,10},{40,11},{40,12},{40,13},{40,14},{40,15},{41,0},{41,1},{41,2},{41,3},{41,4},{41,5},{41,6},{41,7},{41,8},{41,9},{41,10},{41,11},{41,12},{41,13},{41,14},{41,15},{41,16},{41,17},{41,18},{41,19},{41,20},{41,21},{41,22},{41,23},{41,24},{41,25},{41,26},{41,27},{41,28},{41,29},{41,30},{41,31},{41,32},{41,33},{41,34},{41,35},{41,36},{41,37},{41,38},{41,39},{42,0},{42,1},{42,2},{42,3},{42,4},{42,5},{42,6},{42,7},{42,8},{42,9},{42,10},{42,11},{43,0},{43,1},{43,2},{43,3},{43,4},{43,5},{43,6},{43,7},{43,8},{43,9},{43,10},{43,11},{43,12},{43,13},{43,14},{43,15},{43,16},{43,17},{43,18},{43,19},{43,20},{43,21},{43,22},{43,23},{43,24},{43,25},{43,26},{43,27},{43,28},{43,29},{43,30},{43,31},{43,32},{43,33},{43,34},{43,35},{43,36},{43,37},{43,38},{43,39},{43,40},{43,41},{44,0},{44,1},{44,2},{44,3},{44,4},{44,5},{44,6},{44,7},{44,8},{44,9},{44,10},{44,11},{44,12},{44,13},{44,14},{44,15},{44,16},{44,17},{44,18},{44,19},{45,0},{45,1},{45,2},{45,3},{45,4},{45,5},{45,6},{45,7},{45,8},{45,9},{45,10},{45,11},{45,12},{45,13},{45,14},{45,15},{45,16},{45,17},{45,18},{45,19},{45,20},{45,21},{45,22},{45,23},{46,0},{46,1},{46,2},{46,3},{46,4},{46,5},{46,6},{46,7},{46,8},{46,9},{46,10},{46,11},{46,12},{46,13},{46,14},{46,15},{46,16},{46,17},{46,18},{46,19},{46,20},{46,21},{47,0},{47,1},{47,2},{47,3},{47,4},{47,5},{47,6},{47,7},{47,8},{47,9},{47,10},{47,11},{47,12},{47,13},{47,14},{47,15},{47,16},{47,17},{47,18},{47,19},{47,20},{47,21},{47,22},{47,23},{47,24},{47,25},{47,26},{47,27},{47,28},{47,29},{47,30},{47,31},{47,32},{47,33},{47,34},{47,35},{47,36},{47,37},{47,38},{47,39},{47,40},{47,41},{47,42},{47,43},{47,44},{47,45},{48,0},{48,1},{48,2},{48,3},{48,4},{48,5},{48,6},{48,7},{48,8},{48,9},{48,10},{48,11},{48,12},{48,13},{48,14},{48,15},{49,0},{49,1},{49,2},{49,3},{49,4},{49,5},{49,6},{49,7},{49,8},{49,9},{49,10},{49,11},{49,12},{49,13},{49,14},{49,15},{49,16},{49,17},{49,18},{49,19},{49,20},{49,21},{49,22},{49,23},{49,24},{49,25},{49,26},{49,27},{49,28},{49,29},{49,30},{49,31},{49,32},{49,33},{49,34},{49,35},{49,36},{49,37},{49,38},{49,39},{49,40},{49,41},{50,0},{50,1},{50,2},{50,3},{50,4},{50,5},{50,6},{50,7},{50,8},{50,9},{50,10},{50,11},{50,12},{50,13},{50,14},{50,15},{50,16},{50,17},{50,18},{50,19},{51,0},{51,1},{51,2},{51,3},{51,4},{51,5},{51,6},{51,7},{51,8},{51,9},{51,10},{51,11},{51,12},{51,13},{51,14},{51,15},{51,16},{51,17},{51,18},{51,19},{51,20},{51,21},{51,22},{51,23},{51,24},{51,25}};
int res[N],kmp[N];
vector<int>a,b;
bitset<N>f[N];
void bld1(int x){
a.clr(),b.clr();
rep(j,0,x-2)a.pb(j+1),b.pb(j+1);
a.pb(x),b.pb(x+1),a.pb(x),b.pb(x),a.pb(x+1),b.pb(x+1);
}
void bld2(int l,int r){
a.clr(),b.clr(),kmp[l-1]=kmp[l]=l-1;
for(int i=l+1,j=l-1;i<=r;i++){while(l<=j&&res[j+1]!=res[i])j=kmp[j];if(res[j+1]==res[i])j++;kmp[i]=j;}
if(res[l])a.pb(0),b.pb(1);else a.pb(1),b.pb(0);
rep(i,1,r-l)if(res[l+i])a.pb(a[kmp[l+i-1]-(l-1)]),b.pb(i+1);else a.pb(i+1),b.pb(b[kmp[l+i-1]-(l-1)]);
a.pb(a[kmp[r]-(l-1)]),b.pb(b[kmp[r]-(l-1)]);
}
void bld3(int mod,int x){
a.resize(mod*2),b.resize(mod*2);
rep(i,0,mod-1)a[i]=b[i]=(i+1)%mod,a[i+mod]=b[i+mod]=(i+1)%mod+mod;
swap(b[(x+mod-1)%mod],b[(x+mod-1)%mod+mod]);
}
string Solve(int _n){
rep(i,1,100)bld1(i),res[i]=Query(i+2,a,b)==i+1;
per(i,1000,901)res[i]=1,bld2(i,1000),res[i]=Query(1000-i+2,a,b)==1000-i+1;
rep(i,1,800){
bld3(LIST[i][0],LIST[i][1]);
f[i][0]=(Query(LIST[i][0]*2,a,b)>=LIST[i][0]);
rep(j,1,1000)f[i][j]=j%LIST[i][0]==LIST[i][1];
rep(j,1,100)if(f[i][j])f[i][j]=f[i][j]^true,f[i][0]=f[i][0]^(bool)res[j];
rep(j,901,1000)if(f[i][j])f[i][j]=f[i][j]^true,f[i][0]=f[i][0]^(bool)res[j];
}
rep(i,1,800){
rep(j,i,800)if(f[j][100+i]){swap(f[j],f[i]);break;}
rep(j,i+1,800)if(f[j][100+i])f[j]=f[j]^f[i];
}
per(i,800,1){
res[100+i]=f[i][0];
rep(j,1,i-1)if(f[j][100+i])f[j]=f[j]^f[i];
}
string tmp="";rep(i,1,1000)tmp+='0'+res[i];return tmp;
}
/*
g++ -std=gnu++14 -O2 -o grader.exe grader.cpp ancient2.cpp
grader.exe
*/

浙公网安备 33010602011771号