牛客練習賽51 B 子串查詢 (序列自動機)

2021-09-26 23:13:59 字數 1158 閱讀 7723

大致題意

思路對於字元子串行匹配常用如下這種套路。

用乙個next[i][j]陣列維護,在 第 j 個字母及其以後的第乙個字母 i 的位置。然後就可以在這個字串行上跳了,如果跳到匹配串結束也沒出現-1,那就匹配成功。預處理複雜度 o(26xn) ,匹配複雜度等於所有匹配串長度。

**貼一下序列自動機板子,注意每次跳後,要到下乙個字母的後乙個。

now = next[s[i]-『a』][now] + 1

#include

using namespace std;

#define maxn 100005

#define maxm 1000006

#define ll long long int

#define inf 0x3f3f3f3f

#define inc(i,l,r) for(int i=l;i<=r;i++)

#define dec(i,r,l) for(int i=r;i>=l;i--)

#define mem(a) memset(a,0,sizeof(a))

#define sqr(x) (x*x)

#define inf (ll)2e18+1

#define mod 998244353

#define ls x<<1

#define rs x<<1|1

intread()

while

(isdigit

(ch)

)x=x*

10+ch-

'0',ch=

getchar()

;return f*x;

}int n,m;

char s[maxn]

;int a[26]

[maxn]

;int

main()

while

(m--

)else}if

(flag)

printf

("no\n");

else

printf

("yes\n");

}return0;

}

牛客練習賽51(B題 子串查詢)

題目描述 給出乙個長度為n的字串s和q個查詢。對於每乙個查詢,會輸入乙個字串t,你需要判斷這個字串t是不是s的子串。子串的定義就是存在任意下標a輸入描述 第一行兩個數n,q。1 n,q 1e5。第二行乙個長度為n的字串s,所有字元都為小寫拉丁字元。接下來q行每行乙個字串t。1 t 50。輸出描述 對...

牛客練習賽51

theme 給定n與m,要求你用正整數填充n個元素,使得這n個元素的和 m,定義喜愛度為i的個數使得2 i n且a i a i 1 1。1 n 1e5,1 m 1e9 solution 構造題。考慮列舉分成幾個段i,若某段的長度為len,則該段的數為1 len,可知喜愛度應為n i,所以我們的目標是...

題解 牛客練習賽51

字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...