社区讨论

玄关 求调

P14363[CSP-S 2025] 谐音替换参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi0vb2ya
此快照首次捕获于
2025/11/16 06:37
4 个月前
此快照最后确认于
2025/11/17 09:11
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAXN = 1e06 * 5 + 7;
int n, q, alen;
char s[MAXN], t[MAXN], ss[MAXN], tt[MAXN], a[MAXN];
int cnt, tr[MAXN][29], val[MAXN], fail[MAXN];
void trs(char *s, char *t)
{
	int ct = 0;
	int len = strlen(s + 1);
	int st = 1, ed = len;
	for(int i = 1; i <= n; i++)
	{
		if(s[i] == t[i])
			a[++ct] = s[i];
		else
		{
			st = i;
			break;
		}
	}
	for(int i = len; i >= 1; i--)
	{
		if(s[i] != t[i])
		{
			ed = i;
			break;
		}
	}
	a[++ct] = '{';
	for(int i = st; i <= ed; i++)
		a[++ct] = s[i];
	for(int i = st; i <= ed; i++)
		a[++ct] = t[i];
	a[++ct] = '{';
	for(int i = ed + 1; i <= len; i++)
		a[++ct] = s[i];
	alen = ct;
	return ;
}
void ins(char *s)
{
    int p = 0;
    for(int i = 1; i <= alen; i++)
    {
        int c = s[i] - 'a' + 1;
        if(!tr[p][c])
            tr[p][c] = ++cnt;
        p = tr[p][c];
    }
    val[p]++;
    return ;
}
void getFail()
{
	queue <int> q;
	for(int i = 1; i <= 27; i++)
	{
		if(tr[0][i])
		{
			fail[tr[0][i]] = 0;
			q.push(tr[0][i]);
		}
	}
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		for(int i = 1; i <= 27; i++)
		{
			if(tr[u][i])
			{
				fail[tr[u][i]] = tr[fail[u]][i];
				q.push(tr[u][i]);
			}
			else
				tr[u][i] = tr[fail[u]][i];
		}
	}
	return ;
}
int qry(char *t)
{
	int p = 0, res = 0;
	for(int i = 1; i <= alen; i++)
	{
		int c = t[i] - 'a' + 1;
		p = tr[p][c];
		for(int j = p; j and val[j] != -1; j = fail[j])
			res += val[j];
	}
	return res;
}
signed main()
{
//	freopen("replace.in", "r", stdin);
//	freopen("replace.out", "w", stdout);
	scanf("%d%d", &n, &q);
	for(int i = 1; i <= n; i++)
	{
		bool flg = false;
		scanf("%s%s", s + 1, ss + 1);
		int len = strlen(s + 1);
		for(int j = 1; j <= len; j++)
		{
			if(s[j] != ss[j])
			{
				flg = true;
				break;
			}
		}
		if(!flg)
			continue;
		trs(s, ss);
		ins(a);
	}
	getFail();
	while(q--)
	{
		scanf("%s%s", t + 1, tt + 1);
		trs(t, tt);
		printf("%d\n", qry(a));
	}
	return 0;
}
WA 在 #6 #7 #8 #13 #14。
这是链接。 码风不是很好...QwQ

回复

0 条回复,欢迎继续交流。

正在加载回复...