HDU2087 剪花布條(KMP)
阿新 • • 發佈:2018-08-11
inpu math 另有 vector 進行 put 多少 for 模板題
HDU2087 剪花布條
一塊花布條,裏面有些圖案,另有一塊直接可用的小飾條,裏面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?
Input
輸入中含有一些數據,分別是成對出現的花布條和小飾條,其布條都是用可見ASCII字符表示的,可見的ASCII字符有多少個,布條的花紋也有多少種花樣。花紋條和小飾條不會超過1000個字符長。如果遇見#字符,則不再進行工作。
Output
輸出能從花紋布中剪出的最多小飾條個數,如果一塊都沒有,那就老老實實輸出0,每個結果之間應換行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0 3
題解
題意
中文題面,問能剪出幾個子串。
思路
KMP模板題,每次找到位置後,從下個位置進行尋找
代碼
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 0x3f3f3f3f; #define REP(i,n) for(int i=0;i<(n);i++) const int MAXN= 1e6+10; const int MAXM = 1e5+10; int Next[MAXM]; int N,M; void init(){ memset(Next,0,sizeof(int)*(M)); } void getNext(char *s,int *Next){ int m = strlen(s); Next[0] = 0; int j =0; for (int i=1;i<m;i++){ while (j&&s[j]!=s[i]) j = Next[j-1]; if (s[j]==s[i]) j++; Next[i] = j; } } int find(char *ss,char *s,int *Next,int pos){ int n =strlen(ss); int m =strlen(s); int j = 0; for(int i=pos;i<n;i++){ while(j&&s[j]!=ss[i]) j=Next[j-1]; if(s[j]==ss[i]) j++; if(j==m) return i-j+1; } return -1; } char str[MAXN]; char s[MAXM]; int main(){ while(~scanf("%s",str)){ if(strcmp(str,"#")==0) break; init(); scanf("%s",s); int ans =0; getNext(s,Next); int pos=0; int cnt = 0; while(pos!=-1){ pos = find(str,s,Next,cnt); //printf("%d\n",pos); cnt = pos+strlen(s); if(pos!=-1) ans++; } printf("%d\n",ans); } return 0; }
HDU2087 剪花布條(KMP)