Vijos1425子串清除 題解

2022-06-02 16:27:11 字數 1919 閱讀 4887

vijos1425子串清除 題解

描述:

我們定義字串a是字串b的子串當且僅當我們能在b串中找到a串。現在給你乙個字串a,和另外乙個字串b,要你每次從b串中從左至右找第乙個a串,並從b串中刪除它,直到a串不為b串的子串,問你需要進行幾次刪除操作。

輸入格式:

輸入檔案共2行,第一行乙個字串a(長度小於256),第二行乙個字串b。

30%的資料是隨機生成的;

50%的資料滿足輸入檔案大小小於300kb;

100%的資料滿足輸入檔案小於500kb,字串a、b中只會出現英文本母。

輸出格式:

輸出檔案只有乙個整數n。

樣例:

abcabcabcabaabcbccc

樣例說明:

abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc

分析:

剛開始看到這題時,立刻想到了kmp+雙向鍊錶的寫法,但是由於**實現比較複雜,就放棄了這個想法。

一位大神告訴我們可以用棧模擬匹配的操作,每次將元素壓入棧中,看棧頂元素是否與子串匹配,如下圖所示:

例如:子串:abc

母串:abcababcc 。

第一步:

先將a入棧,不匹配;

將b入棧,不匹配;

將c入棧,匹配,並彈出棧頂相應元素,ans++ 。

第二步:

將a入棧,不匹配;

將b入棧,不匹配;

將a入棧,不匹配;

將b入棧,不匹配;

將c入棧,匹配,ans++,彈出相應元素;

第三步:

將c入棧,匹配,ans++,彈出相應元素;

以上就是用棧模擬的過程,下面**:

1 #include "

iostream

"2 #include "

cmath

"3 #include "

cstdio

"4 #include "

cstring"5

#define maxn 1000001067

using

namespace

std ;

8char

a[maxn], b[maxn], stack[maxn];

9int

lena, lenb;

1011

bool match ( int top )//

匹配函式

1218

19return

true;20

21}2223

intmain ( )

2438 top++;39}

40 printf("

%i64d

", ans);

41return0;

42 }

(完)

37 00 vijos p1425 子串清除

p1425子串清除accepted 標籤 顯示標籤 描述 我們定義字串a是字串b的子串當且僅當我們能在b串中找到a串。現在給你乙個字串a,和另外乙個字串b,要你每次從b串中從左至右找第乙個a串,並從b串中刪除它,直到a串不為b串的子串,問你需要進行幾次刪除操作。格式 輸入格式 輸入檔案共2行,第一行...

COdevs1425最長公共子串

題目描述 description 輸入n 2 n 20 個字串,輸出最長公共子串。輸入描述 input description 輸入n再輸入n個字串 輸出描述 output description 輸出最大公共子串。樣例輸入 sample input 3abce cabk jaab 樣例輸出 sam...

Codevs P1425 最長公共子串 KMP

題目描述 description 輸入n 2 n 20 個字串,輸出最長公共子串。輸入描述 input description 輸入n再輸入n個字串 輸出描述 output description 輸出最大公共子串。樣例輸入 sample input 3 abce cabk jaab 樣例輸出 sa...