兩個等長的由大寫英文本母構成的字串a和b,從a中選擇連續子串x,從b中選出連續子串y。子串x與子串y的長度相等。
定義函式f(x,y)為滿足條件xi=yi(1<=i<=|x|)的i的個數,計算f(x,y)的數學期望。
第一行輸入n(1<=n<=2*10^5),表示a和b的長度
第二行輸入字串a
第三行輸入字串b
輸出乙個實數表示f(x,y)的期望,答案保留6位小數。
【樣例解釋】
考慮第乙個樣例,x,y的選擇有5種情況分別是("a","b"),("a","a"),("b","b"),("b","a"),("ab","ba")其中,第2對和第3對所對應的f(x,y)等於1,其他都是0,由於選擇每一對的概率都是1/5,所以f(x,y)的期望為1/5*0+1/5*1+1/5*1+1/5*0+1/5*0=2/5=0.4
solution
上面的乙個a(位置為i)與下面的乙個a(位置為j)
貢獻為min(i,j)*min(n-i+1,n-j+1)
例如xxa***x
***a***
貢獻為min(3,4)*min(4,5)=3*4=12
考慮算答案
把對於每乙個字元,把a串字首和起來,同理也做一遍字尾和
掃一遍b串統計即可
比如上面那個例子
a串的字首0033333
a串的字尾5550000(暫時沒有用到)
#include#include#include#include#include#include#define ll long long
#define maxn 200005
using namespace std;
int n;
double sl[maxn][27],sr[maxn][27],ans;
char a[maxn],b[maxn];
int main()
for(int i=n;i>=1;i--)
for(int i=1;i<=n;i++)
double aa=((double)ans*6.0)/(double)n/(double)(n+1)/(double)(2*n+1);
printf("%.6lf\n",aa);
return 0;
}
字串和字串函式
字元輸入輸出 getchar putchar ch getchar putchar ch 字串函式 字串輸入 建立儲存空間 接受字串輸入首先需要建立乙個空間來存放輸入的字串。char name scanf s name 上述的用法可能會導致程式異常終止。使用字串陣列 可以避免上述問題 char na...
字串和字串函式
1.字串字面量 字串常量 用雙引號括起來的內容稱為字串字面量,也叫字串常量。字串常量屬於靜態儲存類別,這說明如果在函式中使用字串常量,該字串只會被儲存一次,在整個程式的生命期內存在,計時函式被呼叫多次。用雙引號括起來的內容被視為指向該字串儲存位置的指標。hello 中的 hello 類似於乙個陣列名...
字串函式
1 獲取字串的長度 length 2 判斷字串的字首或字尾與已知字串是否相同 字首 startswith string s 字尾 endswith string s 3 比較兩個字串 equals string s 4 把字串轉化為相應的數值 int型 integer.parseint 字串 lon...