C - 剪花布条 HDU - 2087

158 阅读1分钟
  • 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? \

Input

  • 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 \

Output

  • 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。 \

Sample Input

  • abcde a3
    aaaaaa  aa
    #
    

Sample Output

  • 0
    3
    

    \

    \

    \

    纪念自己的模板:

    \

    \

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int mx = 1100;
    char T[mx], S[mx];
    int mynext[mx], len1, len2;
    
    void getmynext(){
    	int j = 0, k = -1;
    	mynext[0] = -1;  //忘了写这个条件 
    	int  len = strlen(T);
    	while(j < len){
    		if(k == -1 || T[k] == T[j]){
    			mynext[++j] = ++k;
    		}
    		else{
    			k = mynext[k];
    		}
    	}
    }
    
    int KMP(int i , int j){  //( S  ,  T)
    		
    	while(i < len1 && j < len2){
    		if(j == -1 ||S[i] ==T[j] ){
    			j++;
    			i++;
    		}
    		else{
    			j = mynext[j];
    		}
    	}
    	if( j == len2)
    		return i - len2;
    	else
    	   return -1;
    }
    int main(){
    	while(scanf("%s", S) && S[0] != '#'){
    		scanf("%s", T);
    		len1 = strlen(S);
    		len2 = strlen(T);
    		getmynext(); 	
    		int cor = 0, count = 0;
    		cor =KMP(cor, 0);
    		
    		while( cor != -1 && cor < len1){
    			count++;
    			cor =KMP(cor + len2, 0);
    		}
    		printf("%d\n", count);
    	
    	}
    	
    	
    	return 0;
    }
    


    \

本文已参与「新人创作礼」活动,一起开启掘金创作之路