zoukankan      html  css  js  c++  java
  • [POJ3461] Oulipo

    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

    BAPC 2006 Qualification

    题解

    (KMP)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    const int Lp=10101,Ls=1001001;
    int lp,ls,nt[Lp];
    char p[Lp],s[Ls];
    
    void Make_nt()
    {
    	int i=0,j=-1;
    	nt[i]=-1;
    	while(i<lp)
    	{
    		if(j==-1||p[i]==p[j])
    			++i,++j,nt[i]=j;
    		else j=nt[j];
    	}
    }
    
    void KMP(int id)
    {
    	int i=id,j=0,Ans=0;
    	while(i<ls&&j<lp)
    	{
    		if(j==-1||s[i]==p[j]) ++i,++j;
    		else j=nt[j];
    		if(j==lp) ++Ans,j=nt[j-1],--i;
    	}
    	printf("%d
    ",Ans);
    }
    
    int main()
    {
    	int T;
    	for(scanf("%d",&T);T;--T)
    	{
    		scanf("%s%s",p,s);
    		lp=strlen(p),ls=strlen(s);
    		Make_nt(),KMP(0);
    	}
    	return 0;
    }
    

    字符串(Hash)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    
    typedef unsigned long long ull;
    const int E=1000007;
    const int L1=2000000,L2=10005;
    int l1,l2;
    char s1[L1],s2[L2];
    ull power[L2],h1[L1],h2;
    
    int main()
    {
    	int T,Ans;
    	power[0]=1;
    	for(int i=1;i<L2;++i) power[i]=power[i-1]*E;
    	for(scanf("%d
    ",&T);T;--T)
    	{
    		scanf("%s
    %s
    ",s2+1,s1+1);
    		l1=strlen(s1+1),l2=strlen(s2+1);
    		for(int i=1;i<=l1;++i) h1[i]=h1[i-1]*E+s1[i];
    		h2=0;
    		for(int i=1;i<=l2;++i) h2=h2*E+s2[i];
    		Ans=0;
    		for(int i=0;i<=l1-l2;++i)
    			if(h2==(h1[i+l2]-h1[i]*power[l2]))
    				++Ans;
    		printf("%d
    ",Ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    windows下的mysql备份恢复命令
    sp_addlinkedserver的使用方法 (转)
    一个以pubs数据库为例的SQL SERVER数据库全文索引
    【C#】可空类型(Nullable)
    【C#】 异常处理
    【电脑常识】如何查看电脑是32位(X86)还是64位(X64),如何知道硬件是否支持64位系统
    【C#】委托Delegate
    【工具】VS2010常用调试技巧(1)
    实验1 总结
    用C语言编程自动生成四则运算
  • 原文地址:https://www.cnblogs.com/hihocoder/p/12213548.html
Copyright © 2011-2022 走看看