hdu 1686 KMP
2015-08-26 14:58
246 查看
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7741 Accepted Submission(s): 3112 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. 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 <iostream> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #include <algorithm> #include <cstdio> #include <string> #include <cstring> #include <cmath> #include <ctime> using namespace std; #pragma comment(linker,"/STACK:102400000,102400000") /// kuo zhan #define clr(s,x) memset(s,x,sizeof(s)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lowbit(x) (x&(-x)) #define PB push_back #define For(i,a,b) for(int i=a;i<b;i++) #define FOR(i,a,b) for(int i=a;i<=b;i++) typedef long long LL; typedef unsigned int uint; typedef unsigned long long ULL; typedef vector<int> vint; typedef vector<string> vstring; void RI (int& x){ x = 0; char c = getchar (); while (c == ' '||c == '\n') c = getchar (); bool flag = 1; if (c == '-'){ flag = 0; c = getchar (); } while (c >= '0' && c <= '9'){ x = x * 10 + c - '0'; c = getchar (); } if (!flag) x = -x; } void RII (int& x, int& y){RI (x), RI (y);} void RIII (int& x, int& y, int& z){RI (x), RI (y), RI (z);} const double PI = acos(-1.0); const int maxn = 1e6 + 100; const int maxm = 1e4 + 100; const LL mod = 1e9 + 7; const double eps = 1e-9; const int INF = 0x7fffffff; /************************************END DEFINE*********************************************/ char s[maxn],t[maxm]; int nxt[maxm]; int T; void get_next(){ int len = strlen(t); nxt[0] = 0; nxt[1] = 0; For(i,1,len){ int j = nxt[i]; while(j && t[i] != t[j])j = nxt[j]; nxt[i+1] = t[i] == t[j] ? j+1 : 0; } } int kmp(){ get_next(); int lens = strlen(s), lent = strlen(t); int j = 0,cnt = 0; For(i,0,lens){ while(j && t[j] != s[i])j = nxt[j]; if(t[j] == s[i]) j++; if(j == lent){ cnt ++; j = nxt[j]; } } return cnt; } int main() { RI(T); while(T--){ scanf("%s%s",t,s); int ans = kmp(); printf("%d\n",ans); } return 0; }
相关文章推荐
- IOS开发之----天气接口的调用
- Conversion to Dalvik format failed with error 1
- C++11 智能指针
- PAT (Basic Level) Practise:1014. 福尔摩斯的约会
- Filter设计实现IP地址限制
- java实现图表
- quartz学习
- maven相关操作
- android cookie持久化
- android cookie持久化
- hdu3085(双向BFS)
- C语言malloc和free实现原理
- 星网锐捷交换机常用命令(不断更新中)
- VC中句柄、指针、ID之间的转换
- android cookie持久化
- How to mount a remote directory in Linux using sshfs
- Android 仿微信联系人Demo
- pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。
- 动态分配三维数组
- poj2362Square