题解:CF2104E Unpleasant Strings
看到
我们想到预处理
考虑如何预处理。memcpy
进 memcpy
进
考虑如何处理询问。就像字典树一样,我们记录一个 break
。反之如果跳到了
code:
#include<bits/extc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e6 + 5;
int n,k,q;
char t[maxn],s[maxn];
int son[maxn][26],ans[maxn];
signed main()
{
scanf("%d%d%s",&n,&k,t + 1);
fill(son[0],son[0] + k,n + 1);// 这里直接把 son[0] 当 lst 用了
fill(ans + 1,ans + n + 1,inf);// ans 初始化 inf
for (int i = n; i >= 1; i--)
{
memcpy(son[i],son[0],sizeof(int) * k);// 把 lst memcpy 进 son[i]
for (int j = 0; j < k; j++)
ans[i] = min(ans[i],ans[son[0][j]] + 1);// 转移
son[0][t[i] - 'a'] = i;// 更新 lst
}
scanf("%d",&q);
while (q--)
{
scanf("%s",s + 1);
int rt = 0,len = strlen(s + 1);
for (int i = 1; i <= len && rt <= n; i++)
rt = son[rt][s[i] - 'a'];// 每次跳,如果跳出去了就说明本就不是悦耳字符串。
printf("%d\n",ans[rt]);
}
return 0;
}