加密
【問題描述】
有一種不講道理的加密方法是: 在字串的任意位置隨機插入字元。 相應的,
不講道理的解密方法就是從字串中恰好刪去隨機插入的那些字元。
給定原文?和加密後的字串?,求?有多少子串可以通過解密得到原文?。
【輸入格式】
輸入第一行包含乙個字串?,第二行包含乙個字串?。
【輸出格式】
輸出一行,包含乙個整數,代表可以通過解密得到原文的?的子串的數量。
【樣例輸入】
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 就是我們最終的所求.好,...