zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Java代码:response压缩响应
    SpringBoot框架:第一章:基础配置和介绍
    asp.net 发送email
    .NET环境下水晶报表使用总结
    ASP.net(c#)生成条形码
    表格操作类(添加,删除,排序,上移,下移)
    NET email
    C#如何打印条形码EAN13码
    在asp.net中备份还原SQL Server数据库
    配置SQL2000数据库发送邮件
  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2610738.html
Copyright © 2011-2022 走看看