Description

Little jay really hates to deal with string. But moondy likes it very much, and she's so mischievous that she often gives jay some dull problems related to string. And one day, moondy gave jay another problem, poor jay finally broke out and cried, " Who
can help me? I'll bg him! "

So what is the problem this time?

First, moondy gave jay a very long string A. Then she gave him a sequence of very short substrings, and asked him to find how many times each substring appeared in string A. What's more, she would denote whether or not founded appearances
of this substring are allowed to overlap.

At first, jay just read string A from begin to end to search all appearances of each given substring. But he soon felt exhausted and couldn't go on any more, so he gave up and broke out this time.

I know you're a good guy and will help with jay even without bg, won't you?

Input

Input consists of multiple cases( <= 20 ) and terminates with end of file.

For each case, the first line contains string A ( length <= 10^5 ). The second line contains an integer N ( N <= 10^5 ), which denotes the number of queries. The next N lines, each with an integer type and a string a (
length <= 6 ), type = 0 denotes substring a is allowed to overlap and type = 1 denotes not. Note that all input characters are lowercase.

There is a blank line between two consecutive cases.

Output

For each case, output the case number first ( based on 1 , see Samples ).

Then for each query, output an integer in a single line denoting the maximum times you can find the substring under certain rules.

Output an empty line after each case.

Sample Input

ab
2
0 ab
1 ab abababac
2
0 aba
1 aba abcdefghijklmnopqrstuvwxyz
3
0 abc
1 def
1 jmn

Sample Output

Case 1
1
1 Case 2
3
2 Case 3
1
1
0

题意:先给你一个字符串,然后给你若干个子串,0代表能够重叠,1代表不能重叠,求出如今母串的次数。

思路:AC自己主动机,多一个推断的是假设这个子串与上次出现的次数大于子串长度的话。就代表这次不是重叠的了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
typedef long long ll;
using namespace std;
const int maxn = 600010; int wordend[100010];
struct Trie {
int nxt[maxn][26], fail[maxn], deep[maxn];
int root, sz;
int cnt[maxn][2], last[maxn]; int newNode() {
for (int i = 0; i < 26; i++)
nxt[sz][i] = -1;
deep[sz++] = 0;
return sz - 1;
} void init() {
sz = 0;
root = newNode();
} void insert(char str[], int num) {
int u = root;
for (int i = 0; str[i]; i++) {
int tmp = str[i] - 'a';
if (nxt[u][tmp] == -1)
nxt[u][tmp] = newNode();
deep[nxt[u][tmp]] = deep[u] + 1;
u = nxt[u][tmp];
}
wordend[num] = u;
} void build() {
queue<int> q;
fail[root] = root;
int u = root;
for (int i = 0; i < 26; i++) {
if (nxt[u][i] == -1)
nxt[u][i] = root;
else {
fail[nxt[u][i]] = root;
q.push(nxt[u][i]);
}
} while (!q.empty()) {
u = q.front();
q.pop();
for (int i = 0; i < 26; i++) {
if (nxt[u][i] == -1)
nxt[u][i] = nxt[fail[u]][i];
else {
fail[nxt[u][i]] = nxt[fail[u]][i];
q.push(nxt[u][i]);
}
}
}
} void query(char *buf) {
for (int i = root; i < sz; i++) {
cnt[i][0] = 0;
cnt[i][1] = 0;
last[i] = -1;
} int u = root;
for (int i = 0; buf[i]; i++) {
u = nxt[u][buf[i]-'a'];
int tmp = u;
while (tmp != root) {
cnt[tmp][0]++;
if (i - last[tmp] >= deep[tmp]) {
cnt[tmp][1]++;
last[tmp] = i;
}
tmp = fail[tmp];
}
}
}
} ac; char buf[100010], word[10];
int type[100010]; int main() {
int n, cas = 1;
while (scanf("%s", buf) != EOF) {
scanf("%d", &n);
ac.init();
for (int i = 0; i < n; i++) {
scanf("%d%s", &type[i], word);
ac.insert(word, i);
}
ac.build();
ac.query(buf);
printf("Case %d\n", cas++);
for (int i = 0; i < n; i++)
printf("%d\n", ac.cnt[wordend[i]][type[i]]);
printf("\n");
}
return 0;
}

ZOJ - 3228 Searching the String (AC自己主动机)的更多相关文章

  1. ZOJ 3228 Searching the String(AC自动机)

    Searching the String Time Limit: 7 Seconds      Memory Limit: 129872 KB Little jay really hates to d ...

  2. ZOJ 3228 Searching the String (AC自己主动机)

    题目链接:Searching the String 解析:给一个长串.给n个不同种类的短串.问分别在能重叠下或者不能重叠下短串在长串中出现的次数. 能重叠的已经是最简单的AC自己主动机模板题了. 不能 ...

  3. ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)

    题目链接:BCD Code 解析:n个病毒串.问给定区间上有多少个转换成BCD码后不包括病毒串的数. 很奇妙的题目. . 经典的 AC自己主动机 + 数位DP 的题目. 首先使用AC自己主动机,得到b ...

  4. zoj 3228:Searching the String

    Description Little jay really hates to deal with string. But moondy likes it very much, and she's so ...

  5. Zoj 3545 Rescue the Rabbit(ac自己主动机+dp)

    标题效果: 鉴于DNA有一个正确的顺序值.请构造一个长度I的DNA在这个序列使DNA正确的顺序值极大.它被认为是负的输出噼啪. .. IDEAS: 施工顺序是,ac己主动机上走,求最大要用到dp dp ...

  6. zoj 3430 Detect the Virus(AC自己主动机)

    题目连接:zoj 3430 Detect the Virus 题目大意:给定一个编码完的串,将每个字符相应着表的数值转换成6位二进制.然后以8为一个数值,又一次形成字符 串,推断给定询问串是否含有字符 ...

  7. zoj 3430 Detect the Virus(AC自己主动机)

    Detect the Virus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Nobita found that his co ...

  8. AC自己主动机

    AC自己主动机 AC自己主动机是KMP和Trie的结合,主要处理多模板串匹配问题.以下推荐一个博客,有助于学习AC自己主动机. NOTONLYSUCCESS  这里另一个Kuangbin开的比赛,大家 ...

  9. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

随机推荐

  1. Oracle 学习----:创建表(主键自增)

    一.创建表 create table testTable ( Id numbere, name varchar2(100), age number, createTime date, primary ...

  2. Leetcode 650.只有两个键的键盘

    只有两个键的键盘 最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). Past ...

  3. pb8.0 mssqlserver 新建数据库连接问题

    将ntwdblib.DLL复制到Sybase\Shared\PowerBuilder目录下 unable to load the requested database interface,无法创建数据 ...

  4. 实战小项目之IMX6 VPU使用

    项目简介 基于官方的demo进行修改,限于能力问题,并没有将功能代码完全从官方的demo中分离出来,还是基于原来的框架进行修改,做了一些简单的封装,我做的工作如下: 使用自己的采集程序 定义6中工作模 ...

  5. ibatis selectKey

    <insert id="insert" parameterClass="A"> <selectKey keyProperty="uu ...

  6. ActionContext源码

    /* * Copyright 2002-2006,2009 The Apache Software Foundation. * * Licensed under the Apache License, ...

  7. pc端自适应方案

    一.常见处理方式 定宽 电商类.内容为主的网站几乎采用这种方式 1.网易考拉.京东(1190px) 2.知乎(1000px),果壳(1000px),网易新闻(1200px) 媒体查询+定宽 图片类.简 ...

  8. 【POJ3693】Maximum repetition substring (SA)

    这是一道神奇的题目..论文里面说得不清楚,其实是这样...如果一个长度为l的串重复多次,那么至少s[1],s[l+1],s[2*l+1],..之中有相邻2个相等...设这时为j=i*l+1,k=j+l ...

  9. css中按钮的四种状态

    css中按钮有四种状态 1. 普通状态2. hover 鼠标悬停状态3. active 点击状态4. focus 取得焦点状态 .btn:focus{outline:0;} 可以去除按钮或a标签点击后 ...

  10. python斐波那契数列复杂度

    契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n ...