POJ3461 Oulipo 【KMP】

来源:互联网 发布:搜狗皮肤编辑器mac 编辑:程序博客网 时间:2024/06/06 01:20

Oulipo
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 22295 Accepted: 8905

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

3BAPCBAPCAZAAZAZAZAVERDIAVERDXIVYERDIAN

Sample Output

130

奇了怪了,最近做题coding时觉得很顺利,但是debug的时候各种问题,今天第31行那里很久才发现漏洞   >_<|||

题意:给定一个模式串和主串,求主串中有多少个模式串(包含重叠)。

题解:这题是KMP的入门题了,只需要从左到右扫描一遍即可得出答案,next数组的意义为:若模式串第j个字符与主串第i个字符不匹配那么模式串指针j必须要回溯到一个位置重新与主串中的第i个字符开始匹配,next就是用来记录这个回溯的位置的,

#include <stdio.h>#define maxn 10002#define maxN 1000002char str1[maxN], str2[maxn];int next[maxn];void getNext(){int i = 0, j = -1;next[0] = -1;while(str2[i]){if(j == -1 || str2[i] == str2[j]){++i; ++j;if(str2[i] == str2[j]) next[i] = next[j];else next[i] = j;}else j = next[j];}}int KMP(){int ans = 0; getNext();int i = 0, j = 0;while(str1[i]){if(j == -1 || str1[i] == str2[j]){++i; ++j;}else j = next[j];if(j != -1 && !str2[j]){ //Attention!!!don't forget "j != -1"!++ans; j = next[j];}}return ans;}int main(){//freopen("stdin.txt", "r", stdin);int t;scanf("%d", &t);while(t--){scanf("%s%s", str2, str1);printf("%d\n", KMP());}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿开塞露后大便肚子疼怎么办 孕早期用开塞露肚子疼怎么办 冰点脱毛后刺痛怎么办 医院建不上档怎么办 dnf输入变繁体怎么办 机械钟表不走了怎么办 火柴枪卡住了怎么办 dnf卖掉的东西怎么办 mac恢复备份失败怎么办 割的双眼皮凹陷怎么办 公司聚餐不想去怎么办 左前分支阻滞怎么办 新电脑特别卡怎么办 夜神安卓模拟器网络没有怎么办 电脑磁盘占用率100怎么办 逆战没有语音怎么办 qt语音登陆不了怎么办 电脑无法识别键盘怎么办 金立f106耗电快怎么办 移动网络速度慢怎么办 手机wifi网络不稳定怎么办 试管取卵腹水怎么办 取卵术后便秘怎么办 基础卵泡3个怎么办 卵巢不好卵泡少怎么办 取卵肚子胀气怎么办 取卵后胃痛胃胀怎么办 取卵后肚子硬胀怎么办 取卵轻微腹水怎么办 取卵后肚子很胀怎么办 胃饿的痛怎么办 卵泡期刺激素低怎么办 生化妊辰后出血不止怎么办? 促卵泡激素偏低怎么办 怀孕一个月吸烟怎么办 多年妊娠纹发痒怎么办 促排卵雌激素低怎么办 潜艇被鱼雷击中怎么办 如果外遇被发现怎么办 手机被骗锁了怎么办 oppor9s忘记开机密码怎么办