這道題感覺還是不太難的。。。
考慮若存在乙個長度為\(len\)的\(border\),那麼對於\(\forall i\in [1,len]\)都有\(s[i]=s[n-len+i]\)
注意到下標之間的差值為\(n-len\),也就是說,所有下標差為\(n-len\)的位置必須相同
這裡的相同包括某乙個是\(?\)的情況,也就是說\(?\)其實是沒有影響的
有了上面的條件,我們可以發現若有一對\((0,1)\)的位置相差\(l\),那麼對於所有的\(x|l\),都不存在長度為\(n-x\)的\(border\)
我們已經知道本題的關鍵就是\((0,1)\)對了,那麼如何來找呢?
考慮構造兩個生成函式\(a(x),b(x)\)
\[a(x)=\sum_^ x^i[s_i=0]\\
b(x)=\sum_^ x^i[s_i=1]\\
\]我們知道卷積的形式就是指數相加,和為定值,那麼我們現在要的是差為定值,那麼把其中乙個生成函式\(reverse\)即可
現在我們得到了新的\(c(x)=a(x)b(x)\),\(c(x)\)的第\(i\)係數即為下標差為\(i-n\)的\((0,1)\)對數
最後我們再列舉下標差即可,時間複雜度\(o(n \log n)\)
#include#define pi acos(-1.0)
#define int long long
using namespace std;
const int n=2e6+10;
const double eps=1e-3;
char s[n];
int n,ans,len=1,tim,rtt[n],f[n];
struct cpa[n*2],b[n];
cp operator + (cp a,cp b);}
cp operator - (cp a,cp b);}
cp operator * (cp a,cp b);}
void fft(cp *a,int flag)}}
}signed main()
if(flag) ans=ans^((n-i)*1ll*(n-i));
}ans^=(n*1ll*n);
printf("%lld\n",ans);
return 0;
}
PKUSC2018 神仙的遊戲 題解
小d和小h發現了一種新的遊戲。給出乙個由0 1 組成的字串 s 將 s 中的問號用0 1替換,對每個 l 口算是否存在替換問號的方案使得 s 長度為 l 的字首成為border,把這個結果記做 f l 0 1 請計算 f 1 times 1 2 otimes f 2 times 2 2 otimes...
5372 Pkusc2018 神仙的遊戲
這題務必用fft寫,反正ntt我bzoj一直tle,loj 8s 做這題首先要知道乙個性質,如果選取長度為len的串,那麼該串可行,一定滿足不存在一對 01,其距離相差len x而不是一開始我想的類似 另外乙個fft的題 那麼如果存在一對01其距離差為len,那麼對於所有k len的串都不可行。考慮...
PKUSC 2018 真實排名
戳我 我們將現在所要進行的數設為 now 我們分情況討論一下 他自己不翻倍 他自己翻倍 我們首先來看看 1 操作 如果要滿足他對排名沒有影響,那麼不能進行翻倍的數只有 lceil frac rceil,now 我考場上不知道在幹嗎,寫的是能進行翻倍的數,麻煩好多,常數也大 我們假設這一段為 cnt ...