1. 程式人生 > >KMP經典入門題

KMP經典入門題

試著寫寫題解,不知道以後會不會養成習慣。。。

前一陣子複習KMP,又回去找了幾道入門題寫寫。。。

切水找找1A的感覺orz。以下大致都是一句話+程式碼的形式。實在是懶。

不過我是複習,本來也沒什麼好說的。 

hdu 1358 找迴圈節、求字串週期,簡單題,題面簡潔。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
const int sz=1e6+5;
char s[sz];
int fail[sz];
int main()
{
	int cas=0;
	for(;;)
	{	int n,len,i,p;
		scanf("%d",&n); if(n==0) break;
		scanf("%s",s+1); len=strlen(s+1); 
		printf("Test case #%d\n",++cas);
		fail[0]=-1; fail[1]=0;
		for(i=2;i<=len;i++)
		{	p=fail[i-1];
			while(p>=0&&s[p+1]!=s[i]) p=fail[p];
			if(p<0) fail[i]=0;
			else fail[i]=p+1;
			if(fail[i]&&i%(i-fail[i])==0) printf("%d %d\n",i,i/(i-fail[i]));
		}
		printf("\n");
	}
	return 0;
}

誒,還是順便說下吧,我的KMP是自己學的,不,應該說是自己理解之後按照自己的思路寫的。

然後寫成了現在這個樣子的完全就和很多資料不同了。。

當然主要差別無非就是,我的陣列下標從1開始而一般的從0開始,然後我寫的是“fail[]”陣列而不是“next[]”陣列。。。

我自己喜歡就好啦~

hdu 1686 匹配,求出現次數;與POJ3461是完全相同的題目。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
const int sz=1e6+4;
char s1[sz],s2[sz];
int fail[sz];
int main()
{
	int cas; cin>>cas;
	while(cas--)
	{	int len1,len2,i,p;
		scanf("%s%s",s1+1,s2+1);
		len1=strlen(s1+1); len2=strlen(s2+1);
		memset(fail,0,sizeof(fail)); fail[0]=-1;
		for(i=1;i<=len1;i++)
		{	for(p=fail[i-1];p>=0&&s1[p+1]!=s1[i];p=fail[p]);
			if(p<0) fail[i]=0;
			else fail[i]=p+1;
		}
		int ans=0;
		for(i=1,p=0;i<=len2;i++)
		{	for(;p>=0&&s1[p+1]!=s2[i];p=fail[p]);
			if(++p==len1){ans++; p=fail[p];}
		}
		printf("%d\n",ans);
	}
	return 0;
}

這大概就是兩道經典入門題吧。。

第一次寫部落格,第一次發程式碼,先這樣。。。我看看效果。。

相關推薦

KMP經典入門

試著寫寫題解,不知道以後會不會養成習慣。。。 前一陣子複習KMP,又回去找了幾道入門題寫寫。。。 切水找找1A的感覺orz。以下大致都是一句話+程式碼的形式。實在是懶。 不過我是複習,本來也沒什麼好說的。  hdu 1358 找迴圈節、求字串週期,簡單題,題面簡潔。 #i

KMP模板以及簡單的入門總結

KMP模板 //kmp演算法的主要作用在於對next陣列的運用,所以這裡只給出next陣列的模板 //性質1:對於每一個長度len的子串,該子串的最小迴圈節為len-next[len] //性質2:kmp的next不斷向前遞迴的過程可以保證對於每一個當前字

poj1741+poj1987+poj2114——點分治入門集合

剛才 是把 註意 幫我 legend 機房 ini ext one 最近看了看點分治,從poj上找到幾道題,都比較裸。而且感覺這三道題都長得差不多呀qwq ———————————————————————————————————————————————— 【poj 1741】

(莫隊算法)兩莫隊算法統計數量的入門

做了 ostream origin scan cmp opened ems view isp 因為這兩題差不多,而且比較簡單,就放一起,做了這題,這種題目就是巨水的題了。隨便寫都行。 CodeForces - 86D Powerful array 題意:

kafka經典入門

stat 緩存 大於 分區 依然 fig tin 發送消息 ray 問題導讀1.Kafka獨特設計在什麽地方?2.Kafka如何搭建及創建topic、發送消息、消費消息?3.如何書寫Kafka程序?4.數據傳輸的事務定義有哪三種?5.Kafka判斷一個節點是否活著有哪

[poj2104]可持久化線段樹入門(主席樹)

unique tor oot 入門題 個數 索引 方便 return 出現的次數 解題關鍵:離線求區間第k小,主席樹的經典裸題; 對主席樹的理解:主席樹維護的是一段序列中某個數字出現的次數,所以需要預先離散化,最好使用vector的erase和unique函數,很方便;如

hdu3555 Bomb (數位dp入門)

accep ota line -c them eight otto time test case Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others

博弈論入門 kiki's game

unsigned str ram right scan logs sel include otto Problem Description Recently kiki has nothing to do. While she is bored, an idea appear

UVALive-4670 AC自動機入門 求出現次數最多的子串

efi con sig http ati code fine mod long /** 鏈接:http://vjudge.net/problem/UVALive-4670 詳見lrj訓練指南P216 */ #include<bits/stdc++.h> usi

hdu3065 病毒侵襲持續中 AC自動機入門 N(N <= 1000)個長度不大於50的模式串(保證所有的模式串都不相同), 一個長度不大於2000000的待匹配串,求模式串在待匹配串中的出現次數。

sizeof archive 模式 emp tomat .... truct print sca /** 題目:hdu3065 病毒侵襲持續中 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 題意:N(N <= 1

hdu 4468 spy 極其精彩的一道kmp靈活運用

sum pen new 最短 agent 描述 數組 ... open 出的超級好的一道題。至於好在哪裏,請思考題目: 題意抽象出來為給定一個字符串r,找出它的一個最短後綴s,使得這個r可以被 s的某前綴+s的某前綴+......+s的某前綴+s本身構造出來。 具體題目描述

[經典]HDU4035 Maze 期望樹形DP

images 一道 隧道 oss 即使 ios bsp esp hdu 這是我當年要刷的一道,自己想死活想不出來,於是去網上頹題解,然後: 這特麽怎麽想都想不出來啊! 題意是這個樣子滴: 有n個房間,由n-1條隧道連通起來,實際上就形成了一棵樹 從結點1出發

HDU 1698 Just a Hook (線段樹區間更新入門

follow and iostream http span meta ali pos num Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O

經典入門_Hash的應用

需要 eof ++ 固定 給定 靜態 post 如果 pre Hash:將存儲位置與數據本身對應掐來的存儲手段就是Hash 例2.5 統計通成績學生人數(1018) 題目描述:讀入n(n<=1000)名學生的成績(0~100,整型)(當讀到n時結束),將獲得某一給定分

經典入門_貪心算法

lin clas .net 最優 3.3 opera 題目 turn spa 貪心是一種總是選擇“當前最好選擇”,而不從整體上去把握的思想,往往這種“貪心”的策略能得到接近最優的結果,甚至某些情況下就是最優解。 例2.11 FatMouse‘Trade(1433) 題目大意

loj6277 數列分塊入門1

++ == gpo names body include its ios 裸題 裸題分塊。 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a[100005],b[10005],n,

loj6278 數列分塊入門2

lower block color sort ace pan 入門 else lock 題意:支持區間加,詢問區間中元素排名 維護兩個域。一個域維護原序列,一個域維護快內排序序列。 每次修改後更新快內排序序列。 修改時O(sqrt(n)log(sqrt(n))) 詢問時O(

POJ - 1469 COURSES (匈牙利算法入門

max pen AR == log ems hid display mes 題意:   P門課程,N個學生。給出每門課程的選課學生,求是否可以給每門課程選出一個課代表。課代表必須是選了該課的學生且每個學生只能當一門課程的。 題解:   匈牙利算法的入門題。 #inclu

Tile Cut~網絡流入門

cas 使用 text nds 現在 clas splay tle add Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like

poj~1236 Network of Schools 強連通入門

str max 計算 () printf bsp 我們 jin ++ 一些學校連接到計算機網絡。這些學校之間已經達成了協議: 每所學校都有一份分發軟件的學校名單(“接收學校”)。 請註意,如果B在學校A的分發名單中,則A不一定出現在學校B的名單中您需要編寫一個計劃,計算必須