【字符串入门专题1】J
来源:互联网 发布:servlet 接收json 编辑:程序博客网 时间:2024/06/09 01:33
Problem 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.
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.
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
题意:用字符串1做模式串,字符串2做匹配串,输出匹配串的总数,允许重叠匹配
思路:kmp模板的套用,我自己思维没转过弯,所以wrong了一次,看了一下别人的题解才知道,允许重叠匹配的话,当匹配到模式串的末尾时,不能直接让j从0重新开始,而是利用next数组,让j回到最大匹配坐标。
#include<cstring>#include<cstdio>#define N 1100000#define M 11000 char s2[M],s1[N];int NEXT[M];void getNext(char s2[],int next[]){int i,j,k;k = -1;j = 0;next[0] = -1;//划重点!!!已经n多次忘记初始化了!! while(s2[j]!='\0'){while(k!=-1&&s2[j]!=s2[k])k = next[k];k++;j++;if(s2[k]!=s2[j])next[j] = k;elsenext[j] = next[k];}return;}void kmp(char s1[],char s2[],int next[]){int i,j,count;i = j = count = 0;while(s1[i]!='\0'){while(j!=-1&&s1[i] != s2[j])j = next[j];j++;i++;if(s2[j]=='\0'){j = next[j];count ++;}}printf("%d\n",count);return;}int main(){int t;scanf("%d",&t);while(t --){scanf("%s",s2);scanf("%s",s1);getNext(s2,NEXT);kmp(s1,s2,NEXT);}return 0;}
阅读全文
0 0
- 【字符串入门专题1】J
- 【搜索入门专题1】 hdu1242 J
- 【二分匹配入门专题1】J
- 【字符串入门专题1】A
- 【字符串入门专题1】 I
- 【字符串入门专题1】 E
- 【字符串入门专题1】B
- 【字符串入门专题1】F
- 【字符串入门专题1】D
- 【字符串入门专题1】C
- NBUT-2014暑期集训专题练习1 -> 二分法 J - J
- 【字符串入门专题1】hdu3613 【一个悲伤的exkmp】
- 1010-J专题三
- 专题三 Problem J
- 专题四 Problem J
- 第四专题 Problem J
- 1010-J专题四
- 搜索专题 J
- mybatis之sql输出映射(七)
- 计算机专业词汇
- Android类加载器源码简析
- 一周一更之attribute
- C#200课的主要内容
- 【字符串入门专题1】J
- 利用顺序栈(基于数组)实现十进制转换输出其他进制数
- sql优化小总结:
- ReactNative——UI3.ScrollView 实现轮播图效果
- Java反射和代理简介
- 大数据经典学习路线(及供参考)
- python 安装zbar
- C++操作符的优先级及网上找的c++primer 第五版课后习题分析
- C语言中的动态内存分配