pipioj 1039 重複子序列問題

2021-10-04 06:19:07 字數 1662 閱讀 1319

pipi有兩個字串a和b,請你求出字串a最少重複幾次才能使得b是a的子串行。

我們稱x是y的子串行當且僅當可以從y中刪除若干個字元得到x。

例如對於a=「abb」, b=「bbaa」,則a重複3次之後得到"abbabbabb",此時b="bbaa"是"abbabbabb"的子串行。

注意,原始串a即算作重複一次。

多組資料。

第一行包含乙個字串a。

第二行包含乙個字串b。

a和b都只包含小寫字母。

對於30%的資料,1 <= |a|, |b| <= 100

對於90%的資料,1 <= |a|, |b| <= 1000

對於100%的資料,1 <= |a|, |b| <= 100000

輸出乙個整數代表答案。如果無論重複多少次都達不到,輸出-1。

abbbbaa

一開始直接暴力搜尋,由於字串可能過長直接超時了。

b中字元需為a中字元的子集,當某個字元b有而a無則無法完成,返回-1。

然後就儲存各種字元以及他的位置,找到字元後在他的位置序列中選取比上乙個字元位置稍大的。

如果沒有比他大的則選取最小的。

返回位置與上乙個字元位置比較,如果前者小於或等於後者表明需要重複一次。反之,無需重複。

#include

#include

#include

using namespace std;

struct chch[26]

;int b[26]

,lena,lenb;

char a[

100005

],b[

100005];

intgetlocat

(int len,

char c,

int p)

if(ch[i]

.locat[mid]

else

if(ch[i]

.locat[mid]

>p) right=mid-1;

};//printf("l,,,%d\n",ch[i].locat[l]);

if(ch[i]

.locat[l]

<=p) l=

(l+1

)%ch[i]

.len;

return ch[i]

.locat[l];}

intmain()

for(i=

0;i) b[b[i]

-'a']++

;for

(i=0

;i<

26;i++)if

((!ch[i]

.len)

&&b[i])if

(flag)

int k=0;

for(i=

0;i<

26;i++)if

(ch[i]

.len==

0) k++

;else

if(k!=

0) ch[i-k]

=ch[i]

;int pa=-1

,pb=

0,p,ans=0;

while

(pbprintf

("%d\n"

,ans);}

}

1039 重複子序列問題

pipi有兩個字串a和b,請你求出字串a最少重複幾次才能使得b是a的子串行。我們稱x是y的子串行當且僅當可以從y中刪除若干個字元得到x。例如對於a abb b bbaa 則a重複3次之後得到 abbabbabb 此時b bbaa 是 abbabbabb 的子串行。注意,原始串a即算作重複一次。多組資...

codevs 1061 重複子串

題目描述 description 某電視台在每乙個星期天都有乙個福利彩票節目,在該節目中有乙個考察幸運觀眾記憶力的節目。節目的安排是這樣的 首先由節目主持人說出一串諸如 左1右2左2左3右4左1 的數值串,然後由幸運觀眾重複該數值串 如果幸運觀眾能全部記憶出節目主持人說的所有數值串,該觀眾將獲得一筆...

最長不重複子序列

其實是一道典型的雙指標問題,只要一直往後去輸入資料,如果遇到重複的資料,就讓begin指標往後移,直到重複的元素不再子串行內,在讀入新資料就可以了,每次遇到重複資料就把maxlength和當前的length比較去大值,就可以了 include include include include incl...