日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Rusty String

發(fā)布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Rusty String 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:

給定一個含有兩種字符'V','K'以及?的字符串,問該串可能的循環(huán)節(jié)。

?

解法:

首先如果對于$d$,我們有不存在 $(j-i) | d$ 且 $S_i = 'V', ?S_j = 'K'$ 的,那么 $d$ 為1循環(huán)節(jié)。

這樣考慮對于每一個 $d$ 求出 $j-i = d$ 的?$S_i = 'V', ?S_j = 'K'$ 是否存在,然后 $O(nlogn)$ 篩一遍即可。

求 $j - i = d$ 的有

$$c_{n - i} = \sum_{0 \leq j \leq i} { a(j) b(n-i+j-1) }$$

$$c_{n - i} = ?(reva \otimes b)_{2n-i-1} = ?\sum_{0 \leq t \leq 2n-i-1}{ reva_t b_{2n-i-1-t} }$$

標準卷積,DFT即可。

?

#include <bits/stdc++.h>#define PI acos(-1)const int N = 500010;using namespace std;struct EX {double real,i;EX operator+(const EX tmp)const{return (EX){real+tmp.real, i+tmp.i};};EX operator-(const EX tmp)const{return (EX){real-tmp.real, i-tmp.i};};EX operator*(const EX tmp)const{return (EX){real*tmp.real - i*tmp.i, real*tmp.i + i*tmp.real};}; };int R[N<<2];void DFT(EX a[],int n,int tp_k) {for(int i=0;i<n;i++) if(i<R[i]) swap(a[i],a[R[i]]);for(int d=1;d<n;d<<=1){EX wn = (EX){cos(PI/d), sin(PI/d)*tp_k};for(int i=0;i<n;i += (d<<1)){EX wt = (EX){1,0};for(int k=0;k<d;k++, wt = wt*wn){EX A0 = a[i+k], A1 = wt * a[i+k+d];a[i+k] = A0+A1;a[i+k+d] = A0-A1;}}}if(tp_k==-1)for(int i=0;i<n;i++) a[i] = (EX){a[i].real/n, a[i].i/n}; }EX A[N<<2],B[N<<2],C[N<<2]; char S[N]; int n; bool del[N],ans[N];void calc(char ch1,char ch2,int tot) {for(int i=0;i<tot;i++) A[i] = B[i] = (EX){0,0};for(int i=0;i<n;i++) if(S[i]==ch1) B[i] = (EX){1,0};for(int i=1;i<=n;i++) if(S[n-i]==ch2) A[i] = (EX){1,0};DFT(A,tot,1);DFT(B,tot,1);for(int i=0;i<tot;i++) C[i] = A[i]*B[i];DFT(C,tot,-1);for(int i=0;i<n;i++){int tmp = (int)(C[2*n-i-1].real+0.5);if(tmp) del[i] = 1;} }int main() {int T;cin>>T;while(T--){scanf("%d%s",&n,S);int L = 0,tot;while((1<<L)<n+n) L++;tot = (1<<L);for(int i=1;i<tot;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));for(int i=0;i<n;i++) del[i] = 0, ans[i+1] = 0;calc('V','K',tot);calc('K','V',tot);for(int i=n-1;i>=0;i--) if(!del[i]) ans[n-i-1] = 1;ans[n] = 1;int cnt = 0;for(int i=1;i<=n;i++){for(int j=i+i;j<=n;j+=i) ans[i] &= ans[j];if(ans[i]) cnt++;}printf("%d\n",cnt);for(int i=1;i<=n;i++) if(ans[i]) printf("%d ",i);printf("\n");}return 0; } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/lawyer/p/7182032.html

總結(jié)

以上是生活随笔為你收集整理的Rusty String的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。