E - Oulipo

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book:

Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant, d’un non-dit : la vision, l’avision d’un oubli commandant tout, où s’abolissait la raison : tout avait l’air normal mais…

Perec would probably have scored high (or rather, low) in the following contest. People are asked to write a perhaps even meaningful text on some subject with as few occurrences of a given “word” as possible. Our task is to provide the jury with a program that counts these occurrences, in order to obtain a ranking of the competitors. These competitors often write very long texts with nonsense meaning; a sequence of 500,000 consecutive 'T's is not unusual. And they never use spaces.

So we want to quickly find out how often a word, i.e., a given string, occurs in a text. More formally: given the alphabet {'A''B''C', …, 'Z'} and two finite strings over that alphabet, a word W and a text T, count the number of occurrences of W in T. All the consecutive characters of W must exactly match consecutive characters of T. Occurrences may overlap.

Input

The first line of the input file contains a single number: the number of test cases to follow. Each test case has the following format:

  • One line with the word W, a string over {'A''B''C', …, 'Z'}, with 1 ≤ |W| ≤ 10,000 (here |W| denotes the length of the string W).
  • One line with the text T, a string over {'A''B''C', …, 'Z'}, with |W| ≤ |T| ≤ 1,000,000.

Output

For every test case in the input file, the output should contain a single number, on a single line: the number of occurrences of the word W in the text T.

Sample Input

3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

Sample Output

1
3
0

hash_AC代码:

/*
Problem: 3461 User: bbsh
Memory: 5296K Time: 110MS
Language: G++ Result: Accepted
*/
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e6+;
typedef int i64;
i64 S,chk,p,P,hash_key[N];
char s1[N],s2[N];
int cas,l1,l2,ans;
inline i64 fpow(i64 a,i64 p){
i64 res=;
for(;p;p>>=,a=a*a) if(p&) res=res*a;
return res;
}
inline void get_s2_key(){
p=fpow(P,l2);S=;
for(int i=;i<=l2;i++) S=S*P+s2[i]-'A';
}
inline void get_s1_key(){
hash_key[]=;
for(int i=;i<=l1;i++) hash_key[i]=hash_key[i-]*P+s1[i]-'A';
}
inline i64 query(int x,int y){
return hash_key[y]-hash_key[x-]*p;
}
int main(){
P=;//prime_num
for(scanf("%d",&cas);cas--;){
scanf("%s%s",s2+,s1+);ans=;
l1=strlen(s1+);l2=strlen(s2+);
get_s2_key();
get_s1_key();
for(int i=l2;i<=l1;i++){
chk=query(i-l2+,i);
if(chk==S) ans++;
}
printf("%d\n",ans);
}
return ;
}

KMP_AC代码:

/*
Problem: 3461 User: bbsh
Memory: 1424K Time: 110MS
Language: G++ Result: Accepted
Source Code
*/
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e6+;
char s1[N],s2[N];
int cas,l1,l2,fail[N];
void get_next(){
int p=;fail[]=;
for(int i=;i<=l2;i++){
while(p>&&s2[i]!=s2[p+]) p=fail[p];
if(s2[i]==s2[p+]) p++;
fail[i]=p;
}
}
void kmp(){
int p=,ans=;
for(int i=;i<=l1;i++){
while(p>&&s1[i]!=s2[p+]) p=fail[p];
if(s1[i]==s2[p+]) p++;
if(p==l2) ans++,p=fail[p];
}
printf("%d\n",ans);
}
int main(){
for(scanf("%d",&cas);cas--;){
scanf("%s%s",s2+,s1+);
l1=strlen(s1+);l2=strlen(s2+);
get_next();
kmp();
}
return ;
}

附KMP算法详细流程讲解

  移步shenben's documents system

POJ 3461 Oulipo[附KMP算法详细流程讲解]的更多相关文章

  1. poj 3461 - Oulipo 经典kmp算法问题

    2017-08-13 19:31:47 writer:pprp 对kmp算法有了大概的了解以后,虽然还不够深入,但是已经可以写出来代码,(可以说是背会了) 所以这道题就作为一个模板,为大家使用吧. 题 ...

  2. POJ 3461 Oulipo(——KMP算法)

    Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...

  3. POJ 3461 Oulipo 【KMP统计子串数】

    传送门:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  4. poj 3461 Oulipo,裸kmp

    传送门 Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32373   Accepted: 13093 Desc ...

  5. poj 3461 Oulipo(KMP模板题)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36903   Accepted: 14898 Descript ...

  6. POJ 3461 Oulipo(KMP裸题)

    Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...

  7. poj 3461 Oulipo(kmp统计子串出现次数)

    题意:统计子串出现在主串中的次数 思路:典型kmp #include<iostream> #include<stdio.h> #include<string.h> ...

  8. poj 3461 Oulipo(KMP)

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 49378   Accepted: 19617 Descript ...

  9. POJ 3461 Oulipo

      E - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

随机推荐

  1. Java命令学习系列(三)——Jmap

    Java命令学习系列(三)——Jmap 2015-05-16 分类:Java 阅读(479) 评论(0) Jmap jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件.远程调试服 ...

  2. windows宿主机ping不通Docker容器的解决办法

      网卡上有       docker is not a virtual machine, and you don't get access to the docker host via IP add ...

  3. 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

    轻量级“集合”迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Gener ...

  4. double类型保留2位小数

    double d = 12.2289; java.text.DecimalFormat df = new java.text.DecimalFormat("#.00"); Syst ...

  5. java笔记知识点总结

    1.switch case default 语句 : switch case 语句是一个条件选择语句,找到相同的case值做为入口,执行后面的程序:若所有的case都不满足,则找default入口:若 ...

  6. ibus拼音安装_ubuntu10.04

    ubuntu10.04自带的拼音输入发太难用,所以从新安装ibus拼音. sudo apt-get install ibus ibus-pinyin ibus-qt4 ibus-gtk 然后运行 ib ...

  7. windows 开启端口

    场景: 解决方法: 选中入站规则,右键选择新建入站规则: 然后 选择“允许连接”,点“下一步”. 效果: 连接成功.

  8. 转)x264重要结构体详细说明(2): x264_image_t、x264_picture_t、x264_nal_t

    转自:http://nkwavelet.blog.163.com/blog/static/2277560382013102923912753/ /*************************** ...

  9. (转)Hdmi edid 数据解析

    Hdmi edid 数据解析    (转自:http://blog.chinaunix.net/uid-20672559-id-3384035.html) 一.EDID数据格式: EDID 1.3 d ...

  10. nodejs基础 -- 事件循环

    Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用, ...