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