BNUOJ 3580 Oulipo
Oulipo
64-bit integer IO format: %lld Java class name: Main
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
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int MaxN = ;
char word[MaxN/], txt[MaxN];
int next[MaxN/];
void KMP_next(char b[], int pre[]) {
int n = strlen(b), k;
pre[] = -;
k = -;
for(int i = ; i < n; i++) {
while(k > - && b[k+] != b[i]) k = pre[k];
if(b[k+] == b[i]) k++;
pre[i] = k;
}
} int main() {
int n;
scanf("%d%*",&n);
while(n--) {
gets(word);
gets(txt);
KMP_next(word, next);
int cnt = , len = strlen(word);
for(int i = , j = -; txt[i]; ++i) {
while(j > - && word[j+] != txt[i]) j = next[j];
if(word[j+] == txt[i]) j++;
if(j == len-) {
cnt++;
j = next[j];
}
}
printf("%d\n", cnt);
}
return ;
}
Source
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = ;
int fail[maxn];
void getNext(const char *pStr, int *nextArr) {
int i = , j = -, pLen = strlen(pStr);
nextArr[i] = j;
while (i < pLen) {
if (pStr[++i] != pStr[++j]) {
nextArr[i] = j;
while (j != - && pStr[i] != pStr[j]) j = nextArr[j];
} else nextArr[i] = nextArr[j];
}
}
char word[maxn],text[maxn];
int main(){
int n,ret;
scanf("%d",&n);
while(n--){
scanf("%s %s",word,text);
getNext(word,fail);
for(int i = ret = ,j = ; text[i]; ++i){
while(j != - && word[j] != text[i]) j = fail[j];
if(!word[++j]) ret++;
}
printf("%d\n",ret);
}
return ;
}
整理以后的,可以选择开启所谓的优化
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = ;
int fail[maxn];
char word[maxn],text[maxn];
void getFail() {
fail[] = -;
fail[] = ;
for(int i = ,j = -; word[i]; ++i) {
while(j != - && word[i] != word[j]) j = fail[j];
fail[i+] = ++j;
if(word[i+] == word[j]) fail[i+] = fail[j];//使用此句加优化,注释掉不加优化,都是正确的
}
}
int main() {
int n,ret;
scanf("%d",&n);
while(n--) {
scanf("%s%s",word,text);
getFail();
for(int i = ret = , j = ; text[i] ; ++i) {
while(j > - && word[j] != text[i]) j = fail[j];
if(!word[++j]) {ret++;j = fail[j];}
}
printf("%d\n",ret);
}
return ;
}
BNUOJ 3580 Oulipo的更多相关文章
- C++之路进阶——poj3461(Oulipo)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35694 Accepted: 14424 Descript ...
- poj3461 Oulipo(KMP模板)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17795 Accepted: 7160 Descripti ...
- BNUOJ 52325 Increasing or Decreasing 数位dp
传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...
- Match:Oulipo(POJ 3461)
Oulipo 题目大意:给你一个字符串,要你找到字符串包含指定子串的个数 只要你知道了KMP,这一题简直不要太简单,注意STL的string是会超时的,还是乖乖用char吧 #include < ...
- bnuoj 24251 Counting Pair
一道简单的规律题,画出二维表将数字分别相加可以发现很明显的对称性 题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=24251 #include< ...
- KMP算法 hdu4686 Oulipo
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...
- hdu----1686 Oulipo (ac自动机)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 字符串hash - POJ 3461 Oulipo
Oulipo Problem's Link ---------------------------------------------------------------------------- M ...
- POJ 3461 Oulipo
E - Oulipo Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
随机推荐
- java面试题(基础部分)
1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...
- Vue.js - day6
注意: 有时候使用npm i node-sass -D装不上,这时候,就必须使用 cnpm i node-sass -D 在普通页面中使用render函数渲染组件 在webpack中配置.vue组件页 ...
- Jenkins在Windows上部署
下载解压安装即可.(注意:不要安装在系统盘) 下载地址:http://mirrors.jenkins-ci.org/war-stable/(官方镜像地址) 去相应目录复制管理员密码粘贴到输入框 选择安 ...
- mysql同步出现1062错误
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;slave start;show slave status \G执行多次,直到不会出现1062错误为止 或者: my.cnf s ...
- Mybatis配置多数据源
一. Spring配置多数据源 二. Spring配置数据源 三. MultipleDataSource的实现 1: package com.wbl.modal; 2: 3: import org. ...
- 一次性删除数据库所有表和所有存储过程 SQL语句
一次性删除数据库所有表和所有存储过程 SQL语句 今天转移数据库数据,需要把数据库原来的表和存储过程清空.删除所有的表:如果由于外键约束删除table失败,则先删除所有约束: --/第1步****** ...
- spark 之主成分分析
C4∗2
- jni ndk 入门
1. Linux环境模拟,下载sygwin 安装,选择devl 和shell -> install sygwin 中的配置ndk环境,进入安装目录c:/cygwin64 etc/profile文 ...
- WPF中播放视频音频
首先要在WPF中播放视频和音频,我们就需要用到MediaElement控件,下面我们示例播放音频和视频. 用MediaElement播放音频: 第一步:将你需要播放的音频(mp3)放在你WPF项目的D ...
- Schur 三角化定理的推论
将学习到什么 从 Schur 的酉三角化定理可以收获一批结果,在这一部分介绍重要的几个. 迹与行列式 相似矩阵具有相同的特征多项式, 从特征多项式一节中, 我们又知道,相似矩阵的迹以及行列式都是相 ...