Jzoj2934 字串函式

2022-05-09 18:05:20 字數 798 閱讀 9637

兩個等長的由大寫英文本母構成的字串a和b,從a中選擇連續子串x,從b中選出連續子串y。

定義函式f(x,y)為滿足條件xi=yi(1<=i<=|x|)的i的個數,計算f(x,y)的數學期望。(|x|=|y|)  

首先顯然不能每個串暴力,我們考慮單獨計算每乙個字元的貢獻

對於b[i],若我們找到a[j]=b[i],可以分兩種情況討論

1.i所以貢獻就是i*j

2.i>j 情況是對稱的,所以貢獻是(n-i+1)*(n-j+1)

所以對於a,我們維護乙個字首和sf[i][c]表示所有j滿足j<=i而且a[j]=c的j的和,和乙個字尾和sb[i][c]表示所有j滿足j>=i且a[j]=c的就的和

那麼對於b[i],貢獻就是(n-i+1)*sf[i][b[i]]+i*sb[i+1][b[i]],累加即可,最後除以總方案數

#include#include#includeusing namespace std;

char a[200010],b[200010]; double a=0;

int n,sf[200010][26],sb[200010][26];

int main()

for(int i=n;i;--i)

for(long long i=1;i<=n;++i)

a+=(n-i+1)*(sf[i][b[i]-'a'])+i*(sb[i+1][b[i]-'a']); //這裡+1是為了防止重複計算

printf("%.6lf\n",a*6/((n+1ll)*(n*2ll+1)*n));

}

Jzoj2934 字串函式

兩個等長的由大寫英文本母構成的字串a和b,從a中選擇連續子串x,從b中選出連續子串y。定義函式f x,y 為滿足條件xi yi 1 i x 的i的個數,計算f x,y 的數學期望。x y 首先顯然不能每個串暴力,我們考慮單獨計算每乙個字元的貢獻 對於b i 若我們找到a j b i 可以分兩種情況討...

JZOJ 3887 字串查詢

給定n個字串和q個詢問 每次詢問在這n個字串中,有多少個字串同時滿足 1.字串a是它的字首 2.字串b是它的字尾 100 資料滿足n,q 50000,字串長度不超過100,任意兩串最長公共字首和最長公共字尾較短 interesting 我比賽的思路是將字串按字首字典序排序,然後二分出一段區間 那麼我...

8 字串函式

right left 可從列中選出指定數量的字元 right location,2 location 欄位 substring index 可擷取部分字段值 substring index location,1 尋找第乙個逗號,然後擷取之前的內容 substring your string,star...