#693. LG2024TG-20

LG2024TG-20

  1. (完善程序)

(最长公共前缀)定义 LCP(s,t)为两个字符串的最长公共前缀。例如:s=abcde,t=abcabc,则 LCP(s,t)=abc。定义|s|为字符串 s 的长度,在上一例中|s|=5。

现在给定了 n 个字符串 s1,s2,...sns_1,s_2,...s_n。现在需要统计所有同时满足如下两个条件的 |LCP(si,sjs_i,s_j)| 之和对 998244353 取模的值:条件 1:i < j。条件 2:sis_i < sjs_j

1n2×1051si201 ≤ n ≤ 2 × 10^5,1 ≤ |s_i| ≤ 20,字符串仅由小写字母构成,试补全程序。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+9,mod=998244353;
char s[maxn][22];
int n;
int tmp[27][maxn],a[maxn];
int dfs(int l,int r,int p){
  if(l>=r||p>=20) return 0;
  int tail[27],ans=0;
  memset(tail,0,sizeof(tail));
  for(int i=l;i<=r;++i){
    int ch=_________________________;
    _________________________;
    for(int j=0;j<ch;++j)
      _________________________;
  }
  int tot=l,pos=l;
  for(int i=0;i<27;++i)
    for(int j=0;j<tail[i];++j)
      a[tot++]=tmp[i][j];
  for(int i=0;i<27;++i){
    _________________________;
    pos+=tail[i];
  }
  return ans;
}
int main(){
  scanf("%d",&n);
  for(int i=1;i<=n;++i) scanf("%s",s[i]);
  for(int i=1;i<=n;++i) a[i]=i;
  printf("%d\n",_________________________);
  return 0;
}

① 处应填( )。

{{ select(1) }}

  • s[i][p] ? s[i][p] - 'a': 0
  • s[i][p] ? s[i][p] - 'a' + 1 : 0
  • s[a[i]][p] ? s[a[i]][p] - 'a': 0
  • s[a[i]][p] ? s[a[i]][p] - 'a' + 1 : 0

② 处应填( )。

{{ select(2) }}

  • tmp[ch][tail[ch]++] = a[i]
  • tmp[ch][++tail[ch]] = a[i]
  • tmp[ch][tail[ch]++] = i
  • tmp[ch][++tail[ch]] = i

③ 处应填( )。

{{ select(3) }}

  • ans = (ans + 1ll * (p - 1) * tail[j] % mod) % mod
  • ans = (ans + 1ll * p * tail[j] % mod) % mod
  • ans = (ans + 1ll * (p + 1) * tail[j] % mod) % mod
  • ans = (ans + 1ll * (p + 2) * tail[j] % mod) % mod

④ 处应填( )。

{{ select(4) }}

  • ans = (ans + dfs(pos + 1, pos + tail[i], p + 1)) % mod
  • ans = (ans + dfs(pos + 1, pos + tail[i], p - 1)) % mod
  • ans = (ans + dfs(pos, pos + tail[i] - 1, p + 1)) % mod
  • ans = (ans + dfs(pos, pos + tail[i] - 1, p - 1)) % mod

⑤ 处应填( )。

{{ select(5) }}

  • dfs(0, n - 1, 0)
  • dfs(1, n, 0)
  • dfs(1, n, 1)
  • dfs(1, n - 1, 1)