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尽然不会超, ...
随机推荐
- KMP算法的Next数组详解(转)
转载请注明来源,并包含相关链接. 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧: http://www.cnblogs.com/yjiyjige/p/3 ...
- hdu1151+poj2594(最小路径覆盖)
传送门:hdu1151 Air Raid 题意:在一个城镇,有m个路口,和n条路,这些路都是单向的,而且路不会形成环,现在要弄一些伞兵去巡查这个城镇,伞兵只能沿着路的方向走,问最少需要多少伞兵才能把所 ...
- COLORREF和COLOR和RGB的总结
一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...
- String ,StringBuffer,StringBuilder精髓比較
1. 在运行速度方面的比較:StringBuilder > StringBuffer > String 2. StringBuffer与StringBuilder.他们是字符串变量,是可改 ...
- Git在下搭建下环境的工具
(本文稿来自:http://www.open-open.com/news/view/55387) Git是一个快速,可扩展的,分布式的版本控制系统.Git服务器起初是专为Linux开发,后来移植至Wi ...
- ArcGIS For Flex报错
1.错误描写叙述 2.错误原因 3.解决的方法
- poj 3311 状压DP
经典TSP变形 学到:1.floyd O(n^3)处理随意两点的最短路 2.集合的位表示,我会在最后的总结出写出.注意写代码之前一定设计好位的状态.本题中,第0位到第n位分别代表第i个城市,1是已经 ...
- Windows Phone开发(42):缓动动画
原文:Windows Phone开发(42):缓动动画 前面在讨论关键帧动画的时候,我有意把几个带缓动动画的关键帧动画忽略掉,如EasingColorKeyFrame.EasingDoubleKeyF ...
- CC2530 外部中断 提醒
#include "ioCC2530.h" #define uchar unsigned char #define led1 P1_0 #define led2 P1_ ...
- 黑马day07 注册案例(二)
1依据index.jsp我们首先制定了注册的功能,当点击注册button什么时候.超链接到注册页面.下面是一个注册jsp页 <%@ page language="java" ...