题目链接:https://www.nowcoder.net/acm/contest/71/B
大致题意:中文题,自己看题面
题目解答:首先我们知道其实很多情况答案都是0,给一个例子:
假设有三个串:ab、abab、aba、很容易看出来答案是2 0 0,所以我们有一个很简单的做法就是先找出长度最短的一个串,然后让她跟所有串匹配边匹配边保存连乘,可知当前乘出来是0的话后边就没必要匹配了,匹配时可用kmp降低复杂度。
#include<string>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define mod 998244353
#define maxn 2000005
string s[maxn],s1;
int p[maxn];
void print(string str)
{
int i,j=-1;p[0]=-1;
for(i=1;i<str.size();i++)
{
while(j>=0 && str[j+1]!=str[i])
j=p[j];
if(str[i]==str[j+1])
j++;
p[i]=j;
}
}
int kmp(string str)
{
int i,j=-1,sum=s1.size(),res=0;
for(i=0;i<str.size();i++)
{
while(j>=0 && s1[j+1]!=str[i])
j=p[j];
if(s1[j+1]==str[i])
j++;
if(j==sum-1)
j=p[j],res++;
}
return res;
}
int main(void)
{
int n,i;
int ans=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
cin >> s[i];
s1=s[1];
for(i=1;i<=n;i++)
if(s[i].length()<s1.length())
s1=s[i];
print(s1);
for(i=1;i<=n;i++)
{
ans=(ll)ans*kmp(s[i])%mod;
if(ans==0) break;
}
for(i=1;i<=n;i++)
{
if(s[i]==s1)
printf("%d\n",ans);
else
printf("0\n");
}
return 0;
}