考前模擬 加密 (正解 容斥原理或暴力)

2022-04-10 17:57:47 字數 1818 閱讀 3381

加密

【問題描述】

有一種不講道理的加密方法是: 在字串的任意位置隨機插入字元。 相應的,

不講道理的解密方法就是從字串中恰好刪去隨機插入的那些字元。

給定原文?和加密後的字串?,求?有多少子串可以通過解密得到原文?。

【輸入格式】

輸入第一行包含乙個字串?,第二行包含乙個字串?。

【輸出格式】

輸出一行,包含乙個整數,代表可以通過解密得到原文的?的子串的數量。

【樣例輸入】

abcabcabc

cba【樣例輸出】

9【樣例解釋】

用[?,?]表示子串開頭結尾的下標(從 0 開始編號) ,這 9 種方案是:

[0,6],[0,7],[0,8],[1,6],[1,7],[1,8],[2,6],[2,7],[2,8]

【資料規模和約定】

30%的資料,|?| 1000。

對於100%的資料,1 ≤ |?| ≤ 300,000,1 ≤ ? ≤ 200。

思路:超時**(待修改):

#include#include

#include

using

namespace

std;

char t[1000010],s[210

];int kszb[1000010

];long

long

int j=1

,ha,te,t,ans;

bool

ok;int add(int ha_now,int te_now,int

ha_last)

int minuss(int length_now,int

length_s)

intmain()

for(int i=1;i)

if(te==strlen(t))

if(t[te]==s[t])

else te++;

}if(!ok)

else

break

; }

cout

fclose(stdout);

}

這是沒超時的**:

#include#include

#include

#ifdef win32

#define lll "%i64d"

#else

#define lll "%lld"

#endif

using

namespace

std;

char t[300010],s[210

];int

l,r,lent,lens,ok;

long

long

ans;

int sq[300010

],thead,ttail;

int front(int b,int ll,int

rr)int behind(int

rr)void pan(int ll,int

rr)void find(int &th,int &tt)

if(tt==lent)

if(t[tt]==s[st])

else tt++;

}}int

main()

else

break

; }

printf(lll,ans);

fclose(stdin);

fclose(stdout);

return0;

}

請各位同志找找不同;

容斥原理 數論

兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...

容斥原理,反演

大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...

關於容斥原理

容斥原理大概是這樣的,以長方體體積並為例,我們需要用容斥原理容斥出若干個長方體體積的並.首先,我們將每個長方體標號為1 n,那麼這些長方體的取捨顯然可以表示為乙個二進位制的數字s.設f s 表示長方體取捨狀態為s時,長方體的體積並,於是我們可以知道f 111111 有n個1 就是我們最終的所求.好,...