UVALive 5103 Computer Virus on Planet Pandora Description 一些新兴需求模式的字符串 AC自己主动机
主题链接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=3104">点击打开链接
题意:
case数
n个模式串
一个母串。
问:n个模式串出现的种数(一个模式串多次出现仅仅算一次)
对于 "ABC" , 若母串出现了"CBA"这种反串。也算出现了。
所以:
1
ABC
CBA
ans = 1
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
const int maxnode = 250*1000+10000;
const int sigma_size = 26; struct Trie{
int ch[maxnode][sigma_size];
int val[maxnode]; //该单词在模式串中出现的次数
int last[maxnode];
int f[maxnode]; //失配数组
int num[maxnode]; //该单词出如今文本串的次数
int pre[maxnode]; //该单词的前驱
int len[maxnode]; //以该单词结尾的单词长度
int Char[maxnode]; //该单词相应的字母
int road[maxnode]; //路径压缩优化 针对计算模式串出现的种数
int sz;
int Newnode()
{
val[sz] = f[sz] = last[sz] = len[sz] = num[sz] = 0;
memset(ch[sz], 0, sizeof ch[sz]);
return sz++;
}
void init(){
sz=0;
Newnode();
}
int idx(char c){ return c-'A'; }
int insert(char *s){
int u = 0;
for(int i = 0, c; s[i] ;i++){
c = idx(s[i]);
if(!ch[u][c])
ch[u][c] = Newnode();
pre[ch[u][c]] = u;
Char[ch[u][c]] = s[i];
len[ch[u][c]] = len[u]+1;
road[ch[u][c]] = 1;
u = ch[u][c];
}
val[u] = 1;
num[u] = 0;
return u;
}
void getFail(){
queue<int> q;
for(int i = 0; i<sigma_size; i++)
if(ch[0][i]) q.push(ch[0][i]);
int r, c, u, v;
while(!q.empty()){
r = q.front(); q.pop();
for(c = 0; c<sigma_size; c++){
u = ch[r][c];
if(!u)continue;
q.push(u);
v = f[r];
while(v && ch[v][c] == 0) v = f[v]; //沿失配边走上去 假设失配后有节点 且 其子节点c存在则结束循环
f[u] = ch[v][c];
}
}
}
void find(char *T){
//计算模式串出现的个数:(每种多次出现算多次)
int j = 0;
for(int i = 0, c, temp; T[i] ; i++){
c = idx(T[i]);
while(j && ch[j][c]==0) j = f[j];
j = ch[j][c]; temp = j;
while(temp){
num[temp]++;
temp = f[temp];
}
}
}
void find_kind(char *T, int &ans){
//计算种数, 反复出现的不再计算(若多个询问则要在此处加for(i=0->sz)lu[i]=1;
int j = 0, i, c, temp;
for(i = 0; T[i]; i++){
c = idx(T[i]);
while(j && ch[j][c] == 0) j = f[j];
j = ch[j][c];
temp = j;
while(temp && road[temp]){
if(val[temp])
{
++ans;
val[temp] = 0;
}
road[temp] = 0;
temp = f[temp];
}
}
}
}ac;
char s[1015], a[5100010], b[5100010], c;
int n, num;
int main() {
int T; scanf("%d", &T);
while (T-->0) {
ac.init();
scanf("%d", &n);
while(n--){
scanf("%s", s);
ac.insert(s);
}
ac.getFail();
int top = 0;
scanf("%s", a);
int i = 0;
while(a[i]){
if(a[i]!='[')
b[top++] = a[i];
else {
num = 0;
i++;
while( '0' <= a[i] && a[i] <= '9')
num = num*10 + a[i]-'0', i++;
c = a[i];
i++;
while(num-- > 0){
b[top++] = c;
}
}
i++;
}
a[top] = b[top] = 0;
for(int i = top-1; i >= 0; i--)a[i] = b[top-i-1];
int ans = 0;
ac.find_kind(b, ans);
ac.find_kind(a, ans);
printf("%d\n", ans);
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
UVALive 5103 Computer Virus on Planet Pandora Description 一些新兴需求模式的字符串 AC自己主动机的更多相关文章
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- hdu ----3695 Computer Virus on Planet Pandora (ac自动机)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1
F - Computer Virus on Planet Pandora Time Limit:2000MS Memory Limit:128000KB 64bit IO Format ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora
Computer Virus on Planet Pandora Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1353 ...
- hdu 3695 Computer Virus on Planet Pandora(AC自己主动机)
题目连接:hdu 3695 Computer Virus on Planet Pandora 题目大意:给定一些病毒串,要求推断说给定串中包括几个病毒串,包括反转. 解题思路:将给定的字符串展开,然后 ...
- HDU-3695 Computer Virus on Planet Pandora
HDU-3695 Computer Virus on Planet Pandora 题意:电脑中病毒了, 现在n钟病毒指令, 然后有一个电脑指令, 看一下这个电脑指令中了几个病毒, 如果电脑种了某一个 ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
- HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)
题意:有n种病毒序列(字符串),一个模式串,问这个字符串包括几种病毒. 包括相反的病毒也算.字符串中[qx]表示有q个x字符.具体见案列. 0 < q <= 5,000,000尽然不会超, ...
随机推荐
- struts2文件上传限制大小问题
struts2默认文件上传大小为2M,如需改动默认大小,解决方法例如以下: <struts> <constant name="struts.multipart.maxSiz ...
- 在Activity中为什么要用managedQuery()
刚開始接触android的时候,每次用数据库都会犹豫使用哪种方式,一种是getContentResolver().query(...),还有一种是managedQuery(...),后来习惯了使用前一 ...
- 阿里巴巴2015研究project普通笔试题,与答案
欢迎您对这篇文章的其他建议.我可以留言在以下平台. 个人博客网站:www.anycodex.com/blog/ Csdn博客网站:http://my.csdn.net/?ref=toolbar 微博: ...
- (白书训练计划)UVa 120 Stacks of Flapjacks(构造法)
题目地址:UVa 120 水题. 从最大的開始移,每次都把大的先翻到最上面,再翻到以下. 代码例如以下: #include <iostream> #include <cstdio&g ...
- poj3140(树的dfs)
题目链接:http://poj.org/problem?id=3140 题意:给定一棵n棵节点的树,求删去某条边后两个分支的最小差异值. 分析:num[u]表示以u点为根节点的子树的总人数,那么不在该 ...
- css中padding中样式的顺序含义
4种可能的情况.举例说明: padding:10px; 四个内边距都是10px padding:5px 10px; 上下5px 左右10px padding:5px 10px 15px; 上5px 右 ...
- vim netrw
我们现在试一下vim文件功能,当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录(从操作系统的视角来看,目录其实是一种特殊的文件).例如,我们在vim中执行命令”:e -/ ...
- linux下安装cmake和mysql遇到的问题总结
首先是在安装cmake的过程中遇到的问题: 1.開始使用yum命令安装时,不知道为什么一直不行,然后就准备wget 来先下载压缩包,再手动编译. 因为网络限制,wget不能下载外网的东西一直显示con ...
- Spring in action(Spring实战) 第四版中文翻译
第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...
- UVA 707 - Robbery(内存搜索)
UVA 707 - Robbery 题目链接 题意:在一个w * h的图上.t个时刻,然后知道一些信息,每一个时刻没有小偷的矩阵位置,问哪些时刻能够唯一确定小偷位置.和确定小偷是否已经逃走,假设没逃走 ...