【HDU - 2087】 剪花布条(直接模拟 or KMP)
生活随笔
收集整理的這篇文章主要介紹了
【HDU - 2087】 剪花布条(直接模拟 or KMP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
一塊花布條,里面有些圖案,另有一塊直接可用的小飾條,里面也有一些圖案。對于給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢??
Input輸入中含有一些數據,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字符表示的,可見的ASCII字符有多少個,布條的花紋也有多少種花樣?;y條和小飾條不會超過1000個字符長。如果遇見#字符,則不再進行工作。?
Output輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。?
Sample Input
Sample Output
0 3?
解題報告:
????? ? 從i開始的不成立必須從i+1開始!不能從不成立的那個點開始!雖然也能水過,但是顯然那樣是不對的。
ac代碼:(模擬)
#include<iostream> #include<cstring> #include<cstdio> using namespace std;char a[1000 + 5]; char b[1000 + 5]; int main() {int lena,lenb;while(scanf("%s",a)) {if(a[0]=='#') break;scanf("%s",b);lena=strlen(a);lenb=strlen(b);int cnt=0;int x=0,y=0;//x->a y->bwhile(x<lena) {if(a[x]==b[y]) {x++;y++;if(y==lenb) {cnt++;y=0;}}else {x=x-y+1;y=0; } }printf("%d\n",cnt); }return 0 ; }ac代碼2:(KMP)
(稍后帖)(已補)
#include<cstdio> #include<cstring> #define ll long long using namespace std; char s[1000005]; char t[1000005]; int next[1000005]; int len1,len2; void getnext() {int j = 0,k = -1;next[0] = -1;while(j<len2-1) {if(k == -1 || t[j] == t[k]) {j++,k++;next[j] = k;}else k = next[k];} } int kmp() {int cnt = 0;int i=0,j=0;while(i < len1) {if(j == -1 || s[i] == t[j]) {i++,j++;}else {j=next[j];}if(j >= len2) {cnt++;j=0;}}return cnt;} int main() {while(~scanf("%s",s)) {if(s[0] == '#') break;scanf("%s",t);len1 = strlen(s);len2 = strlen(t);getnext();printf("%d\n",kmp());}return 0; }總結:
今天是2018.10.22,時隔三個月,,我終于是來補上這篇KMP的代碼了。感慨萬千啊!!原來三個月前的我還是只會寫暴力,代碼格式十分丑陋的小渣渣,一暑假的熏陶,真的是看到了自己的變化。應了學長那句話啊,暑假留校的時光必定會是你進步最快的兩個月!!!感謝經歷!!祝自己越來越好。
另:可以看看自己對KMP模板總結的那個博客,想想如果從1開始讀入字符串的話應該怎么寫。博客鏈接
總結
以上是生活随笔為你收集整理的【HDU - 2087】 剪花布条(直接模拟 or KMP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OfcPfwSvc.exe - OfcP
- 下一篇: 0.《沉浸式线性代数》:前言