KMP 牛客 NC13253 子串

2021-10-10 19:37:08 字數 1629 閱讀 4057

題目描述

給出乙個正整數n,我們把1…n在k進製下的表示連起來記為s(n,k),例如s(16,16)=123456789abcdef10, s(5,2)=11011100101。現在對於給定的n和字串t,我們想知道是否存在乙個k(2 ≤ k ≤ 16),使得t是s(n,k)的子串。

輸入描述:

第一行乙個整數n(1 ≤ n ≤ 50,000)。

第二行乙個字串t(長度 ≤ 1,000,000)

輸出描述:

「yes"表示存在滿足條件的k,否則輸出"no」

示例1輸入複製8

01112

輸出複製

yes分析:

先按照題意把1-n的數字轉化為2-16進製制的字串,再用kmp來判斷是否t出現在字串中。或者用strstr()函式也可以來判斷。

注意:轉化k進製的時候,大於9的數字轉化為大寫字母a-f,並且轉化的時候需要倒敘存入目標字串。

kmp

#include

#define ll long long

using

namespace std;

const

int n =

1e6+10;

char a[n]

,b[n]

,c[n]

;int ne[n]

;void

get_ne()

else j=ne[j];}

}int

kmp(

int n)

if(j==l)

return1;

return0;

}int

main()

else c[

++t]

=y+'0'

; x=x/i;

}for

(int z=t;z>=

0;z--)}

b[++k]

='\0';if

(kmp

(k))}if

(f==1)

printf

("yes");

else

printf

("no");

return0;

}

strstr()函式

#include

#define ll long long

using

namespace std;

const

int n =

1e6+10;

char a[n]

,b[n]

,c[n]

;int

main()

else c[

++t]

=y+'0'

; x=x/i;

}for

(int z=t;z>=

0;z--)}

b[++k]

='\0';if

(strstr

(b,a)

!=null)}

if(f==1)

printf

("yes");

else

printf

("no");

return0;

}

牛客 13253 子串

給出乙個正整數n,我們把1 n在k進製下的表示連起來記為s n,k 例如s 16,16 123456789abcdef10,s 5,2 11011100101。現在對於給定的n和字串t,我們想知道是否存在乙個k 2 k 16 使得t是s n,k 的子串。第一行乙個整數n 1 n 50,000 第二行...

牛客NC13230 合併回文子串

題目鏈結 題目描述 輸入兩個字串a和b,合併成乙個串c,屬於a和b的字元在c中順序保持不變。如 abc 和 xyz 可以被組合成 axbycz 或 abxcyz 等。我們定義字串的價值為其最長回文子串的長度 回文串表示從正反兩邊看完全一致的字串,如 aba 和 xyyx 需要求出所有可能的c中價值最...

牛客題霸 研發 NC127 最長公共子串

本題鏈結 給定兩個字串str1和str2,輸出兩個字串的最長公共子串,如果最長公共子串為空,輸出 1。輸入 1ab2345cd 12345ef 返回值 2345 動態規劃問題 假設兩個字串長度為n m,具體分析其問題 最優子結構 如果知道 n 1 m 1 長度字串的最長公共子串s,則 n m 長度字...