链接:https://www.nowcoder.com/acm/contest/71/B
来源:牛客网

题目描述

设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
BALDRSKYKirishimaRain
输出例子:
1

-->

示例1

输入

1
BALDRSKYKirishimaRain

输出

1

备注:

1 ≤ n ≤ 10^6,所有字符串的总长度不超过2*10^6

题解

$kmp$。
先观察一下要求的那个东西,注意是乘积,有一个为$0$即为$0$。
也就是说,只有长度最短的那些可能不为$0$,其余的一定为$0$。
长度最短的那些不全等,那么也是$0$,否则和别的都计算一遍即可。
#include <bits/stdc++.h>
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 j, k;
j = 0; k = -1; nx[0] = -1;
while(j < tlen)
if(k == -1 || T[j] == T[k])
nx[++j] = ++k;
else
k = nx[k];
} int kmp(string &a) {
slen = a.length();
for(int i = 0; i < slen; i ++) {
S[i] = a[i];
S[i + 1] = 0;
}
int aa = 0;
int i, j = 0;
if(slen == 1 && tlen == 1)
{
if(S[0] == T[0])
return 1;
else
return 0;
}
for(i = 0; i < slen; i++)
{
while(j > 0 && S[i] != T[j])
j = nx[j];
if(S[i] == T[j])
j++;
if(j == tlen)
{
aa++;
j = nx[j];
}
}
return aa;
} int main() {
scanf("%d", &n);
int mn_len = 2 * maxn;
for(int i = 1; i <= n; i ++) {
cin >> s[i];
len[i] = s[i].length();
for(int j = 0; j < len[i]; j ++) {
h[i] = h[i] * base % mod;
h[i] = (h[i] + s[i][j]) % mod;
}
mn_len = min(mn_len, len[i]);
}
int idx;
for(int i = 1; i <= n; i ++) {
if(len[i] == mn_len) idx = i;
}
int fail = 0;
for(int i = 1; i <= n; i ++) {
if(len[i] == mn_len) {
if(h[i] != h[idx]) fail = 1;
}
} if(fail == 0) {
for(int i = 0; i < len[idx]; i ++) {
T[i] = s[idx][i];
T[i + 1] = 0;
}
tlen = len[idx];
getNext();
long long A = 1;
for(int i = 1; i <= n; i ++) {
if(len[i] == mn_len) continue;
A = A * kmp(s[i]) % mod;
if(A == 0) break;
}
for(int i = 1; i <= n; i ++) {
if(len[i] == mn_len) ans[i] = A;
}
} for(int i = 1; i <= n; i ++) {
printf("%lld\n", ans[i]);
} return 0;
}

Wannafly挑战赛9 B - 数一数的更多相关文章

  1. Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数

    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数 题目描述 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 输入描述: 第一行一个数n 第 ...

  2. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  3. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  4. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  5. Wannafly挑战赛24游记

    Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...

  6. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  7. Wannafly挑战赛26-F. msc的棋盘(模型转化+dp)及一类特殊的网络流问题

    题目链接 https://www.nowcoder.com/acm/contest/212/F 题解 我们先考虑如果已知了数组 \(\{a_i\}\) 和 \(\{b_i\}\),如何判断其是否合法. ...

  8. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  9. 【Wannafly挑战赛24E】旅行

    [Wannafly挑战赛24E]旅行 题面 牛客 题解 首先有一个非常显然的\(dp\):我们直接把\(s\rightarrow t\)的路径抠出来然后设\(f_{i,j}\)表示到第\(i\)个点, ...

  10. Wannafly挑战赛27 D绿魔法师

    链接Wannafly挑战赛27 D绿魔法师 一个空的可重集合\(S\),\(n\)次操作,每次操作给出\(x,k,p\),要求支持下列操作: 1.在\(S\)中加入\(x\). 2.求\[\sum_{ ...

随机推荐

  1. Redis学习八:Redis的事务

    一.是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 二.能干嘛 一个队列中,一次性.顺序性.排他性的执行一系列命 ...

  2. JS开启浏览器全屏模式,需要手动触发

    <html > <meta charset="UTF-8"> <body> <button onclick="launchFul ...

  3. TensorFlow在win10上的安装与使用(二)

    在上篇博客中已经详细的介绍了tf的安装,下面就让我们正式进入tensorflow的使用,介绍以下tf的特征. 首先tf有它独特的特征,我们在使用之前必须知晓: 使用图 (graph) 来表示计算任务, ...

  4. 9、StringBuffer和StringBuilder

    StringBuffer简介 StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer.工作原理StringBuffer的底层是char数组,如果 ...

  5. Linux基础-swap交换分区

    任务:对一块15G大小的硬盘进行分区,主分区为5G,扩展分区10G,一个逻辑分区5G作为swap交换分区,并激活查看新的swap分区 第一步,建立的新的SCSI硬盘,开启Linux系统前添加一块大小为 ...

  6. 2016.08.02 math(leetcode) 小结

    math(leetcode) 小结 在leetcode中有些知识点(套路) 判断一个数是不是能被某些数整除,可以用 n%x == 0,循环除的话,就将while(n%x == 0)的循环条件设置判断整 ...

  7. win10安装

    1.启动盘制作 首先我们需要登陆“微软中国下载中心”,从中下载一款名为“MediaCreationTool”的工具,利用该工具可以制作Win10安装U盘.直接通过以下地址快速进入“Windows下载中 ...

  8. Wannacry样本取证特征与清除

    一.取证特征 1)网络域名特征 http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 2)文件特征 母体文件 mssecsvc.exe c: ...

  9. C# WebClient进行FTP服务上传文件和下载文件

    定义WebClient使用的操作类: 操作类名称WebUpDown WebClient上传文件至Ftp服务: //// <summary> /// WebClient上传文件至Ftp服务 ...

  10. java四舍五入BigDecimal和js保留小数点两位

    java四舍五入BigDecimal保留两位小数的实现方法: // 四舍五入保留两位小数System.out.println("四舍五入取整:(3.856)="      + ne ...