• C++之路进阶——poj3461(Oulipo)


    Oulipo
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 35694   Accepted: 14424

    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

    Source

    题解:

        kmp经典例题,因为题目说可压缩,所以末尾+1的失败指针指向1,1的失败指针指向0,就ok了。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define maxn 1000000
     6 
     7 using namespace std;
     8 
     9 int next[maxn],n;
    10 char W[maxn],T[maxn];
    11 
    12 void getnext()
    13     {
    14         int j=0,k=-1;next[0]=-1;
    15         while (!j||W[j]!=0)
    16            {
    17                 if (k==-1||W[j]==W[k])
    18                   {
    19                     j++,k++;
    20                     if (W[j]!=W[k]) next[j]=k;else next[j]=next[k];
    21                }else k=next[k];
    22            }
    23     }
    24     
    25 int kmp()
    26     {
    27         int i=0,j=0,num=0;
    28         memset(next,0,sizeof(next));
    29         int T_len=strlen(T),W_len=strlen(W);
    30         getnext();
    31         while (i<T_len)
    32            {
    33                 if (j==-1||T[i]==W[j]) i++,j++;
    34                    else j=next[j];
    35                 if (j==W_len)
    36                   {
    37                         num++;
    38                         j=next[j];
    39                   }
    40            }
    41         return num;       
    42     }    
    43 
    44 int main()
    45   {
    46       scanf("%d",&n);
    47       for (int i=1;i<=n;i++)
    48          {
    49               scanf("%s%s",W,T);
    50               printf("%d
    ",kmp());
    51          }
    52       return 0;
    53   }
    54   
  • 相关阅读:
    [leetcode]Length of Last Word
    本周第一天
    本月第一周的第一天
    获取本周的第一天
    PHP实现今天是星期几
    mysql获取相隔时间段的数据
    在mysql中给查询的结果添加序号列
    《岛上书店》
    正则表达式:在大写字母前面加_
    Git忽略文件的三个办法
  • 原文地址:https://www.cnblogs.com/grhyxzc/p/5750795.html
Copyright © 2020-2023  润新知