★☆ 輸入檔案: 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
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
【樣例輸出】
1
【來源】
BAPC 2006 Qualification
POJ 3461
KMP的裸題,
但是可以用字元串hash搞,
對于單詞a,文章b
我們先求出單詞a的hash值,再求出文章b的每一位的hash值,
然後枚舉文章b的每一位,判斷一下區間是否合法就好
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<cstring>
6 #include<algorithm>
7 #include<map>
8 #define lli long long int
9 #define ull unsigned long long
10 using namespace std;
11 const ull MAXN=1000001;
12 ull base=27;
13 void read(ull &n)
14 {
15 char c='+';ull x=0;bool flag=0;
16 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
17 while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
18 n=flag==1?-x:x;
19 }
20 ull Pow[MAXN];
21 ull ha[MAXN];
22 ull pd(ull l,ull r){return (ull)ha[r]-Pow[r-l+1]*ha[l-1];}
23 char a[MAXN];
24 char b[MAXN];
25 int main()
26 {
27 freopen("oulipo.in","r",stdin);
28 freopen("oulipo.out","w",stdout);
29 ull n;read(n);
30 Pow[0]=1;
31 for(ull i=1;i<=MAXN;i++)
32 Pow[i]=Pow[i-1]*base;
33 while(n--)
34 {
35 int ans=0;
36 scanf("%s%s",a+1,b+1);
37 int la=strlen(a+1);ull lb=strlen(b+1);
38 ull hasha=0;
39 for(ull i=1;i<=la;i++)
40 hasha=hasha*base+a[i];
41 for(ull i=1;i<=lb;i++)
42 ha[i]=ha[i-1]*base+b[i];
43 for(ull i=1;i<=lb-la+1;i++)
44 {
45 ull k=pd(i,i+la-1);
46 if(k==hasha)
47 ans++;
48 }
49
50 printf("%d\n",ans);
51 }
52 return 0;
53 }
作者:自為風月馬前卒
個人部落格http://attack204.com//
出處:http://zwfymqz.cnblogs.com/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。