題意:給乙個串,求形如aba,其中b的長度為m,a的長度不限的子串的數量。
求正串反串的字尾陣列和對於h的rmq。列舉a串長度len,對於每個長度為len的區間處理在這段區間開始的子串個數。
每隔len列舉i,然後用rmq求i和i+len+m的最長公共字首字尾l,r。統計長度為len的在區間 [ i-l+1 , i+r-1 ] 內部的長度為len的串個數。
為了避免算重,l和r對len取min。
#include
using namespace std;
#define n 101000
#define ll long long
int n,m,cnt;
ll ans;
int a[n],b[n],bir[n];
struct suffix_array
void getsa()
for(int i=1;i<=n;i++)
}for(int i=1;i<=20;i++)
for(int j=1;j<=n;j++)
if(j-(1
<1)>0)
h[j][i]=min(h[j][i-1],h[j-(1
<1)][i-1]);
}
int query(int
x,int
y)
s1.getsa();
s2.getsa();
for(int i=1,j=0;i<=n;i++)
for(int len=1;len*2+m
<=n;len++)
for(int i=1;i+len+m
<=n;i+=len)
printf("%lld\n",ans);
return
0;}
bzoj 1692 字尾陣列
將乙個字串進行如下操作 每次拿去首或尾,放在新字串尾,問新字串字典序最小的情況。直覺貪心,但情況複雜。可以用字尾陣列,每次比較當前剩餘串正序和倒序哪種字典序小,可以如下構建 abcd abcd0dcba include include include include include include ...
BZOJ1031(字尾陣列)
題意 給出乙個字串,求出所有全排列後,按字典序從小到大排序,每個串的最後一位組成的字串 題解 字尾陣列搞一搞,將他複製一遍,跑乙個sa,那麼對於長度n以後的字串在sa中可以不管,算是個模板題吧 include include include include include include inclu...
bzoj3998 字尾陣列複習
對於乙個給定長度為n的字串,求它的第k小子串是什麼。其中可能有重複和不重複的k小子串。我只會字尾陣列 sa做法 當t 0的詢問,我們從sa i 開始,每次sa i 這個字尾,我們會加入n sa i 1個子串,其中height i 個是和sa i 1 重複的,所以我們記乙個變數每次加上n 1 heig...