代码拉取完成,页面将自动刷新
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2000005;
int n, m;
char s[MAXN], t[MAXN];
int trie[MAXN][26], tot=1;
int L[MAXN], R[MAXN], num;
int mark[MAXN], pos[MAXN];
int fa[MAXN], val[MAXN];
struct Persistent_Trie{
int sum, ch[26];
}tr[MAXN];
int rt[MAXN], cnt;
void add(int &cur, int pre, int now, int v) {
cur=++cnt;
tr[cur]=tr[pre];
tr[cur].sum+=v;
if (now==1) return;
add(tr[cur].ch[val[now]], tr[pre].ch[val[now]], fa[now], v);
}
int ask(int cur, int now) {
if (now==0) return tr[cur].sum;
if (tr[cur].ch[t[now]-'a']) return ask(tr[cur].ch[t[now]-'a'], now-1);
return 0;
}
void dfs(int x) {
// cout << x << endl;
L[x]=++num;
pos[num]=x;
for (int i=0; i<26; i++) {
if (trie[x][i]) {
fa[trie[x][i]]=x;
val[trie[x][i]]=i;
dfs(trie[x][i]);
}
}
R[x]=num;
}
int main() {
scanf("%d", &n);
for (int i=1; i<=n; i++) {
scanf("%s", s+1);
int len=strlen(s+1);
int p=1;
for (int j=1; j<=len; j++) {
if (!trie[p][s[j]-'a']) trie[p][s[j]-'a']=++tot;
p=trie[p][s[j]-'a'];
}
mark[p]++;
}
dfs(1);
for (int i=1; i<=num; i++) {
if (mark[pos[i]]) {
// cout << pos[i] << endl;
add(rt[i], rt[i-1], pos[i], mark[pos[i]]);
} else {
rt[i]=rt[i-1];
}
}
scanf("%d", &m);
int ans=0;
for (int T=1; T<=m; T++) {
scanf("%s%s", s+1, t+1);
int len1=strlen(s+1), len2=strlen(t+1);
for (int i=1; i<=len1; i++) s[i]=(s[i]-'a'+ans)%26+'a';
// for (int i=1; i<=len1; i++) cout << s[i];
// cout << endl;
for (int i=1; i<=len2; i++) t[i]=(t[i]-'a'+ans)%26+'a';
int p=1;
bool flag=true;
for (int i=1; i<=len1; i++) {
if (trie[p][s[i]-'a']) p=trie[p][s[i]-'a'];
else {
flag=false;
break;
}
}
if (!flag) {
printf("%d\n", ans=0);
} else {
printf("%d\n", ans=ask(rt[R[p]], len2)-ask(rt[L[p]-1], len2));
}
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。