Wannafly挑戰賽9 B 數一數

2022-05-12 18:42:49 字數 1530 閱讀 2901

設s,t為兩個字串,定義f(s,t) = t的子串中,與s相等的串的個數。如f("ac","acacac")=3, f("bab","babab")=2。現在給出n個字串,第i個字串為si。你需要對

,求出,由於答案很大,你只需要輸出對 998244353取模後的結果。

第一行乙個整數n。

接下來n行每行乙個僅由英文本母構成的非空字串,第i個字串代表s

i
共n行,第i行輸出

對 998244353取模的結果。
示例1

1

baldrskykirishimarain

1

1 ≤ n ≤ 10^6,所有字串的總長度不超過2*10^6
$kmp$。

先觀察一下要求的那個東西,注意是乘積,有乙個為$0$即為$0$。

也就是說,只有長度最短的那些可能不為$0$,其餘的一定為$0$。

長度最短的那些不全等,那麼也是$0$,否則和別的都計算一遍即可。

#include using namespace std;

const long long mod = 998244353ll;

const long long modh = 1e9 + 7;

const long long base = 131ll;

const int maxn = 1e6 + 10;

string s[maxn];

int len[maxn];

long long ans[maxn];

long long h[maxn];

int n;

char s[2 * maxn], t[2 * maxn];

int slen, tlen;

int nx[2 * maxn];

void getnext()

int kmp(string &a)

int aa = 0;

int i, j = 0;

if(slen == 1 && tlen == 1)

for(i = 0; i < slen; i++)

}return aa;

}int main()

mn_len = min(mn_len, len[i]);

} int idx;

for(int i = 1; i <= n; i ++)

int fail = 0;

for(int i = 1; i <= n; i ++)

} if(fail == 0)

tlen = len[idx];

getnext();

long long a = 1;

for(int i = 1; i <= n; i ++)

for(int i = 1; i <= n; i ++)

} for(int i = 1; i <= n; i ++)

return 0;

}

Wannafly挑戰賽9 B 數一數

找出最短的字串s,則對於其他字串t 除去與s相等的情況 都有f s,t 0 因為要求所有的結果相乘,因此最後一定是0.因此只需求出最短的字串即可。不要忘記考慮存在多個 最短且相等的字串的情況 若存在多個最短且不想等的字串 則最後結果一定為0 includeusing namespace std co...

wannafly 挑戰賽9 D(卡特蘭數)

題目描述 wyf正試圖用乙個棧來構造一棵樹,現在他已經構造了n個元素作為樹的節點,只要將這n個元素依次入棧出棧就可以形成一棵樹了。當然,這個問題與樹並沒有關係,所以它叫做wyf的棧。每次你可以入棧乙個新元素或者當棧非空時出棧乙個元素,n個元素必須依次入棧,而wyf希望其中第m個元素入棧之後,棧中恰好...

Wannafly挑戰賽5 B 數學規律

題目描述 這個比賽,歸根結底就是控制乙個虛擬的小拖拉機跑完整個賽道。一般一場比賽會有 9 個到 13 個賽道,最後看能跑完多少個賽道。通常在一場可程式設計拖拉機比賽中,分別會有實際參賽隊伍數 10 20 30 向下取整的隊伍獲得金 銀 銅牌,其餘隊伍獲得榮譽提名,俗稱 鐵牌 但是主辦方往往會多準備一...