• poj 3461 kmp算法


    Oulipo
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 12500   Accepted: 4971

    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
    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 char str1[10005], str2[1000005];
     4 int num, pre[10005];
     5 void prekmp()
     6 {
     7     int i, j = -1, n = strlen(str1);
     8     pre[0] = -1;
     9     for(i = 1;i < n; i++)
    10     {
    11         while(j > -1 && str1[j+1] != str1[i])
    12         j = pre[j];
    13         if(str1[j+1] == str1[i])
    14         j++;
    15         pre[i] = j;
    16     }
    17 }
    18 void kmp()
    19 {
    20     int i,n,m,k;
    21     n = strlen(str2);
    22     m = strlen(str1);
    23     for(k = -1, i = 0; i < n; i++)
    24     {
    25         while(k > -1 && str1[k+1] != str2[i])
    26         k = pre[k];
    27         if(str1[k+1] == str2[i])
    28         k++;
    29         if(k == m-1)
    30         {
    31             num++;
    32             k = pre[k];
    33         }
    34 
    35     }
    36 }
    37 int main()
    38 {
    39     int n;
    40     char c1, c2;
    41     scanf("%d",&n);
    42     while(n--)
    43     {
    44         scanf("%s%c%s%c",str1,&c1,str2,&c2);
    45         num = 0;
    46         prekmp();
    47         kmp();
    48         printf("%d\n",num);
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    LCA模板
    bzoj1660:[Usaco2006 Nov]badhair乱头发节
    不老的传说
    田忌赛马
    最短路径问题
    hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)
    hdu1215-七夕节-(埃氏筛+唯一分解定理)
    迷宫-(bfs)
    区间或和-(位运算)
    海啸-(矩阵前缀和)
  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2610738.html
Copyright © 2020-2023  润新知