/**********************jibancanyang**************************
*author* :jibancanyang
*created time* : 五 5/ 6 16:14:59 2016
*file name* : jy.cpp
**problem**:
**analyse**:
此題難就難在編碼,還有題意問的是病毒有多少種不是多少個,注意char已經不能表示解碼之後的字元,要用
256的int來表示.
**code**:
***********************[email protected]**********************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef pair pii;
typedef
long
long ll;
typedef
unsigned
long
long ull;
vector
vi;
#define pr(x) cout << #x << ": " << x << " "
#define pl(x) cout << #x << ": " << x << endl;
#define pri(a) printf("%d\n",(a));
#define xx first
#define yy second
#define sa(n) scanf("%d", &(n))
#define sal(n) scanf("%lld", &(n))
#define sai(n) scanf("%i64d", &(n))
#define rep(i, a, n) for (int i = a; i < n; i++)
#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)
const
int mod = int(1e9) + 7, inf = 0x3fffffff;
const
int maxn = 100000 + 13;
const
int maxtrie = 520 * 90 + 12; //注意這裡為最多500個單詞,每個單詞最多500個字母,所以節點最多為乘
const
int maxcharset = 256; //字元集合
const
char charst = 0; //起始字元
int buf[maxn];
int bufcnt;
char base64[maxn];
int bitcnt;
bool bit[maxn * 10];
int getv(char x)
void pb(int x)
}void tobit(char c)
void decode(void)
for (int i = 0; i < bitcnt; i += 8)
buf[bufcnt++] = temp;
}}bool used[523];
struct trie
void init(void)
void insert(int buf, int id)
end[now] = id;
}void build(void)
while (!q.empty()) }}
int query(int buf)
temp = fail[temp];}}
return ret;
}}ac;
int main(void)
sa(m);
ac.build();
for (int i = 0; i < m; i++)
puts("");
}return
0;}
ZOJ 3494 AC自動機 數字DP
有一種bcd編碼方案,求a到b範圍內的數字的bcd編碼有多少個不包含不能包含的字串。數字範圍這麼大,很明顯就能看出來是數字dp。基於ac自動機的數字dp使得數字dp容易了不少,因為ac自動機自帶狀態轉移。在數字dp選取每一位的時候,基於ac自動機狀態轉移一下,如果轉移到不能轉移的狀態,就直接返回 1...
zoj3494 ac自動機 數字dp
題解 把給的串建ac自動機,然後得到的bcd i j bcd i j 表示在ac自動機上的狀態i,後面加入j會轉移的狀態,1表示不能加 然後數字dp,dp i j 表示取到第i位狀態為j後面的數字隨便取的方案數,這裡是記憶化。include include include include inclu...
AC自動機 建立nlogn個AC自動機
string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...