37 00 vijos p1425 子串清除

2022-09-14 18:30:13 字數 2515 閱讀 1213

p1425子串清除accepted

標籤:[顯示標籤]

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

格式 輸入格式

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

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

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

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

輸出格式

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

樣例1

樣例輸入1[複製]

abc

abcabcabaabcbccc

樣例輸出1[複製]

5 限制

1 second

提示 樣例說明:abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc

** conan from hnsdfz

【題解】

kmp問題。

找到乙個匹配之後很正常的想法就是把那個匹配刪掉。然後指標往前移動2*模式串的長度(這樣就可以避免後面的串往前移動漏解了);

然後j=0繼續找匹配;

但是直接把它刪掉會超時(s.erase()這個函式);

所以考慮邊讀邊輸入。

直接指標往前移動模式串的長度,然後把新讀入的東西覆蓋在刪掉的串的開頭即可。

當然。不用真的邊讀邊輸入。先整串輸入下來存成temp,然後再模擬輸入就好了。

#include 

#include

#include

using

namespace

std;

string s2, s1,temp;

int f[200000];

int main()

int i = 0, j = 0, num = 0,top =0,now = 0;

cin >> temp;//先整串讀入下來

int mt = temp.size();

s1 = temp;//用乙個top指向當前已經讀到**了。

while (true)

while (j && s2[j] != s1[i]) j = f[j];

if (s2[j] == s1[i]) j++;//kmp演算法

if (j == len2)

else

i++;

if (now == mt)//如果已經讀到最後一位了。則結束。

break;//如果是在最後一位匹配,那麼之前也都不會受到影響了。所以可以大膽的結束

}printf("%d\n", num);

return

0;}

#include 

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ll long long

#define rep1(i,a,b) for (int i = a;i <= b;i++)

#define rep2(i,a,b) for (int i = a;i >= b;i--)

#define mp make_pair

#define pb push_back

#define fi first

#define se second

#define rei(x) scanf("%d",&x)

#define rel(x) scanf("%i64d",&x)

typedef pair pii;

typedef pairpll;

const

int dx[9] = ;

const

int dy[9] = ;

const

double pi = acos(-1.0);

const

int maxn = 20e4;

string a,b;

int lena,lenb,f[maxn],i = 1,top = 1,j = 1,now = 1,ans = 0;

string s;

int main()

s = b;//一開始s是乙個空的字串;得隨便給他賦值乙個東西;

while (true)

while (j>1 && s[i]!=a[j]) j = f[j];

if (s[i]==a[j])

j++;

if (j>lena)

else

i++;

if (now>lenb)

break;

}cout

<< ans << endl;

return

0;}

Vijos1425子串清除 題解

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

vijosP1567子串計數

描述 現在有乙個字串,請求出這個字串不相同的子串個數。yxy現在不會做,請你來幫忙 n 20w 題解 字尾陣列裸題,其實我在練習模板寫對了沒 1 include2 include3 include4 include5 include6 include7 include8 include9 inclu...

COdevs1425最長公共子串

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