BZOJ 1009 HNOI 2008 GT考试 AC自动机+矩阵乘法
2015-02-09 08:04
429 查看
题目大意:给出一个不能出现的字符串,问长度为k的字符串有多少种。
思路:用给定串建立一个AC自动机(或者KMP随便了),然后跑矩阵乘法就行了。
CODE:
思路:用给定串建立一个AC自动机(或者KMP随便了),然后跑矩阵乘法就行了。
CODE:
#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int k,length,p; char s[MAX]; int son[MAX][MAX],cnt; bool end[MAX]; void Insert() { int now = 0; for(int i = 1; i <= length; ++i) { if(!son[now][s[i] - '0']) son[now][s[i] - '0'] = ++cnt; now = now->son[now][s[i] - '0']; } end[now] = true; } void MakeTrieGraph() { static queue<int> q; for(int i = 0; i <= 9; ++i) if(son[0][i]) q.push(i); while(!q.empty()) { int x = q.front(); q.pop(); for(int y,i = 0; i <= 9; ++i) { if(y = son[x][i]) { int r; for(r = fail[x]; r && !son[r][i]; r = fail[r]); faik[j] = son[r][i]; q.push(y); } else son[x][i] = son[fail[x]][i]; } } } int main() { cin >> k >> length >> p; scanf("%s",s); Insert(); MakeTrieGraph(); for(int i = 0; i <= cnt; ++i) for(int j = 0; i <= 9; ++i) if(son[i][j] && !end[i] && !end[son[i][j]]) ++Ma return 0; }
相关文章推荐
- bzoj1009: [HNOI2008]GT考试 矩阵乘法
- BZOJ 1009 [HNOI2008]GT考试 ——矩阵乘法 KMP
- 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
- [HNOI2008]BZOJ1009 GT考试 - 动态规划 - 矩阵乘法 - KMP
- [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
- BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)
- BZOJ 1009 [HNOI2008]GT考试 AC自动机+矩阵乘法
- 【BZOJ1009】【HNOI2008】GT考试 AC自动机+矩阵乘法
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
- BZOJ 1009 [HNOI2008]GT考试 矩阵乘法+DP
- [BZOJ1009]HNOI2008 GT考试|KMP|递推|矩阵乘法
- [矩阵乘法+KMP] BZOJ1009: [HNOI2008]GT考试
- 【DP+KMP+矩阵乘法】BZOJ1009(HNOI2008)[GT考试]题解
- 【BZOJ1009】【HNOI2008】GT考试
- 【KMP+矩阵加速】BZOJ1009[HNOI2008]GT考试
- BZOJ1009 [HNOI2008]GT考试
- [省选前题目整理][BZOJ 1009][HNOI 2008]GT考试(KMP+DP+矩阵快速幂)
- BZOJ 1009 [HNOI2008]GT考试
- BZOJ1009 [HNOI2008]GT考试(KMP算法+矩阵加速dp)