C -カットファブリックストリップHDU - 2087
トピック接続:https://vjudge.net/contest/70325#problem/C
トピック:
ファブリックストリップは、いくつかのパターンがあり、そして、内部のいくつかのパターンが小さいトリムに直接使用可能な別のものがあります。与えられた小さな布のストリップの場合とトリム、行うには、できるだけ多くのいくつかの小さなトリムからカットファブリックストリップを計算しますか?
入力は、小さな布のストリップであり、布の彼らのストリップが見えるASCII文字があると、ペアでトリム入力データの数が含まれている、あなたはどのようにASCII文字の多く、また、布パターンどのように多くのトリックを見ることができます。小さなリブトリムと1000の以上の文字はありません。#あなたが文字を満たしている場合は、もはや作業ではありません。
ない1、それは0正直出力した場合の出力アップがトリムからの出力パターンの数が少ないが、布をカットし、それぞれの結果の間でラップする必要があります。
サンプル入力
ABCDE A3 AAAAAA AA #サンプル出力
0 。3
アイデアを:覆われていない評価した場合KMP、限り、パターン文字列の長さを満たすJ ==文字列の長さが、後者は、J == 0であり、そして再びゼロから開始することができるモードとして、インクリメントされるANS
// // 2019年8月15日にHJYLによって作成されます。 // する#include <iostreamの> の#include <ベクトル> の#include <マップ> 書式#include < 文字列 > の#include <キュー> の#include <スタック> の#include < セット > の#include <アルゴリズム> 書式#include <cstdioを> する#include < CString> の#include <cmath> の#include <cstdlib> 使用して 名前空間はstdを、 typedefの長い 長いLL。 ; チャーSTR [MAXN]、0009 [MAXN]。 int型nextt [MAXN]。 ボイドGETNEXT() { int型 I = 0、J = - 1 。 INT、N = STRLEN(0009)。 nextt [ 0 ] = - 1 。 一方(iは< N) { 場合(J == - 1 || 0009 [I] == 0009 [J]) { ++ I、++ J。 もし(!STR1 [I] = STR1 [J]) nextt [i]は = jで。 他 nextt [I] =nextt [J]。 } そう J = nextt [J]。 } } int型KMP() { int型 I = 0、J = 0 。 int型 ANS = 0 ; INT、M = STRLEN(STR)。 INT、N = STRLEN(0009)。 一方(iは< M) { 場合(J == - 1 || STR [I] == 0009 [J]) { iが ++、J ++を。 } そう J = nextt [J]。 もし(J == N) J = 0、++ ANS 。 } 戻りANS。 } int型のmain() { ながら(〜のscanf(" %sの" 、STR)) { 場合(STR [ 0 ] == ' #' ) ブレーク。 scanf関数(" %sの" 、0009)。 GETNEXT(); printf(" %d個の\ n " 、KMP())。 } 戻り 0 。 }