zoukankan      html  css  js  c++  java
  • kmp——cogs 1570 乌力波

    1570. [POJ3461]乌力波

    ★☆   输入文件:oulipo.in   输出文件:oulipo.out   简单对比
    时间限制:1 s   内存限制:256 MB

    【题目描述】

    法国作家乔治·佩雷克(Georges Perec,1936-1982)曾经写过一本书,《敏感字母》(La disparition),全篇没有一个字母‘e’。他是乌力波小组(Oulipo Group)的一员。下面是他书中的一段话:

     

       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…

     

    佩雷克很可能在下面的比赛中得到高分(当然,也有可能是低分)。在这个比赛中,人们被要求针对一个主题写出甚至是意味深长的文章,并且让一个给定的“单词”出现次数尽量少。我们的任务是给评委会编写一个程序来数单词出现了几次,用以得出参赛者最终的排名。参赛者经常会写一长串废话,例如500000个连续的‘T’。并且他们不用空格。

    因此我们想要尽快找到一个单词出现的频数,即一个给定的字符串在文章中出现了几次。更加正式地,给出字母表{'A','B','C',...,'Z'}和两个仅有字母表中字母组成的有限字符串:单词W和文章T,找到W在T中出现的次数。这里“出现”意味着W中所有的连续字符都必须对应T中的连续字符。T中出现的两个W可能会部分重叠。

    【输入格式】

    输入包含多组数据。

    输入文件的第一行有一个整数,代表数据组数。接下来是这些数据,以如下格式给出:

    第一行是单词W,一个由{'A','B','C',...,'Z'}中字母组成的字符串,保证1<=|W|<=10000(|W|代表字符串W的长度)

    第二行是文章T,一个由{'A','B','C',...,'Z'}中字母组成的字符串,保证|W|<=|T|<=1000000。

    【输出格式】

    对每组数据输出一行一个整数,即W在T中出现的次数。

    【样例输入】

    3

    BAPC

    BAPC

    AZA

    AZAZAZA

    VERDI

    AVERDXIVYERDIAN

    【样例输出】

    1

    3

    0

     
     1 #include<iostream>       //KMP
     2 #include<cstring>
     3 #include<cstdio>
     4 
     5 #define W 10000+10
     6 #define T 1000000+10
     7 
     8 using namespace std;
     9 
    10 char w[W],t[T];
    11 int n,fail[W];
    12 int l1,l2;
    13 int sum=0;
    14 
    15 void Fail();
    16 void doit();
    17 
    18 int main()
    19 {
    20     freopen("oulipo.in","r",stdin);
    21     freopen("oulipo.out","w",stdout);
    22     scanf("%d",&n);
    23     while(n--)
    24     {
    25         memset(w,0,sizeof(w));
    26         memset(t,0,sizeof(t));
    27         memset(fail,0,sizeof(fail));
    28         sum=0;
    29         scanf("%s%s",w,t);
    30         Fail();doit();
    31         printf("%d
    ",sum);
    32     }
    33     fclose(stdin);fclose(stdout);
    34     return 0;
    35  } 
    36 void Fail()                                            //建立fail数组 
    37 {
    38     fail[0]=0;
    39     l1=strlen(w);
    40     l2=strlen(t);
    41     for(int j=0,i=1;i<l1;i++)
    42     {
    43         while(j&&w[j]!=w[i])  j=fail[j-1];
    44         if(w[j]==w[i]) j++;
    45         fail[i]=j;
    46     }
    47 }
    48 void doit()                                             //搜查单词出现次数 
    49 {
    50     int j=0;
    51     for(int i=0;i<l2;++i)
    52     {
    53         while(j&&w[j]!=t[i])
    54           j=fail[j-1];
    55         if(w[j]==t[i])  j++;
    56         if(j==l1)
    57         {
    58             sum++;
    59             j=fail[j-1];
    60         }
    61     }
    62 }
  • 相关阅读:
    HDU 2196 Computer
    HDU 1520 Anniversary party
    POJ 1217 FOUR QUARTERS
    POJ 2184 Cow Exhibition
    HDU 2639 Bone Collector II
    POJ 3181 Dollar Dayz
    POJ 1787 Charlie's Change
    POJ 2063 Investment
    HDU 1114 Piggy-Bank
    Lca hdu 2874 Connections between cities
  • 原文地址:https://www.cnblogs.com/yuemo/p/5494560.html
Copyright © 2011-2022 走看看