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...