設s,t為兩個字串,定義f(s,t) = t的子串中,與s相等的串的個數。如f("ac","acacac")=3, f("bab","babab")=2。現在給出n個字串,第i個字串為si。你需要對
,求出,由於答案很大,你只需要輸出對 998244353取模後的結果。
第一行乙個整數n。i接下來n行每行乙個僅由英文本母構成的非空字串,第i個字串代表s
。
共n行,第i行輸出
對 998244353取模的結果。示例1
1baldrskykirishimarain
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 向下取整的隊伍獲得金 銀 銅牌,其餘隊伍獲得榮譽提名,俗稱 鐵牌 但是主辦方往往會多準備一...