NOI2016 優秀的拆分

2021-10-02 07:49:21 字數 1005 閱讀 3481

看到題目,資料範圍有點怪異。

對於95%的資料,

對於100%的資料,

意思是只有5分是正解。

好吧,95pts的

很明顯,答案就是

而如何才能拿到100pts呢?我們可以先列舉a段的長度,很明顯每個長度為lcp,與往後求lcs,若

這樣就可以通過

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define int ll

#define maxn 30005

const int mo=3e7+7;

#define gc() getchar()

templateinline void read(_t &x)

while(s>='0'&&s<='9')

x*=f;

}int t,a[maxn],b[maxn],n;

int powm[maxn],hash[maxn];

char ns[maxn];

int gethash(int l,int r)

signed main()

int head=i-ans+1;l=1;r=len;ans=0;

while(l<=r)

int tail=i+ans-1;

head=max(head+len-1,i);tail=min(tail,i+len-1);

if(head<=tail)

}int res=0;

for(int i=1;i<=n;i++)a[i]+=a[i-1],b[i]+=b[i-1];

for(int i=1;i

printf("%lld\n",res);

} return 0;

}

NOI2016 優秀的拆分

題目實際上要求我們求從每個點出發的aa串的數量 考慮點i的答案,發現如果字首i與字首j j i 的最長公共字尾 i j,那麼i點出發向前就存在乙個長度為i j的aa串,題目即求對於每個字首,有多少個在他之前的字首滿足條件 考慮字尾自動機,由於每個字首都是字尾自動機parent樹上的一點,即兩個字首的...

NOI2016 優秀的拆分

點此看題 首先轉化問題,我們可以求出a i b i a i b i a i b i 即以i ii結束 開始的aaaa aa串的數量,這樣答案就可以表示為 a i b i 1 sum a i times b i 1 a i b i 1 求這兩個陣列,可以隔距離len lenle n設定乙個點,這樣乙個...

NOI2016 優秀的拆分

如果乙個字串可以被拆分為 aabb 的形式,其中 a 和 b 是任意非空字串,則我們稱該字串的這種拆分是優秀的。例如,對於字串 aabaabaa,如果令 a mathrm b mathrm 我們就找到了這個字串拆分成 aabb 的一種方式。乙個字串可能沒有優秀的拆分,也可能存在不止一種優秀的拆分。比...