時間限制:c/c++ 3秒,其他語言6秒
空間限制:c/c++ 262144k,其他語言524288k
64bit io format: %lld
題目描述
given n strings s_1, s_2, \cdots, s_ns1
,s2 ,⋯,sn
. now define f(s,t) as the maximum i that satisfy s_ = t_s
1…i
=t∣t∣−i+1…∣t∣
, and if such i doesn』t exist, f(s,t)=0.
the problem is to calculate:
\sum_\sum_f(s_i, s_j)^2 \pmod∑
i=1n ∑
j=1n
f(si
,sj )
2(mod998244353)
輸入描述:
the first line contains one integer n~(1 \leq n \leq 10^5)n (1≤n≤10
5), denoting the number of given strings.
the following n lines each contains a string s_i~(i = 1, 2, \cdots, n)si
(i=1,2,⋯,n).
it』s guaranteed that 1\leq |s_i|, \sum|s_i| \leq 10^61≤∣si
∣,∑∣si
∣≤10
6and all strings only contain lowercase letters.
輸出描述:
only one line containing one integer, denoting the answer.
示例1輸入複製3
abba
aba輸出
複製29
題意:給定n個字串,每乙個串字首和其他串的字尾進行匹配,計算匹配的最大長度的平方和。
題解:雜湊函式預處理每乙個字串的字尾,並記錄每乙個雜湊值,然後處理每個字串的字首雜湊值,統計每個字串的貢獻值,但是,例如」aba「,這個字元,其字首「a」,「aba」,會被重複統計,所以需要跑一遍kmp求出next陣列,來處理掉這種重複的情況,最後計算答案即可。
由於雜湊函式不經常寫,忘記key值該怎麼取了,wa了幾次。
key應該是取較大的素數(我認為是這樣)。
#include
using
namespace std;
typedef
unsigned
long
long ull;
typedef
long
long ll;
const ll mod=
998244353
;const
int n=
1e6+
500;
const
int key=
131;
mapint>mp;
string s[n]
;int has[n]
;int nex[n]
;void
hash
(string a)
return;}
void
kmp(string a,
int n)
}int
main()
ll ans=0;
for(
int i=
1; i<=n;
++i)
kmp(s[i]
,len)
;for
(int j=
1; j<=len;
++j)
for(
int j=
1; j<=len;
++j)
}printf
("%lld\n"
,ans)
;return0;
}
2020牛客暑期多校訓練營(第二場
b.boundary 數學 以乙個點為基礎,暴力列舉另外乙個點就可以,就是算圓心的時候有點廢手。ac include inline long long read while c 0 c 9 return x s using namespace std define newnode treenode ...
2020牛客暑期多校訓練營(第二場)
c.cover the tree 首先你從以乙個度不為1的點作為根節點。然後你每次都連線乙個葉子節點,這樣顯然是所有的邊都可以被覆蓋。即答案為度為1的點的個數,但是這樣顯然很大,可以優化,可以相當於把根節點當作中間節點,讓葉子節點兩兩相連,顯然答案已經出來了,就是 葉子 1 2 但是怎麼兩兩配對是乙...
2020牛客暑期多校訓練營(第二場)
給你同一天的兩個時刻,請你計算這兩個時刻中間相隔多少秒?注意一下輸入的格式。include includeusing namespace std int main lcm i,j 其中 lcm 是最小公倍數的簡寫 the least common multiple 求每個大小為 k k 的子矩陣的最...