社区讨论

蒟蒻关于这题序列自动机做法的一个疑问

P1819公共子序列参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lo3bypnl
此快照首次捕获于
2023/10/24 04:08
2 年前
此快照最后确认于
2023/10/24 04:08
2 年前
查看原帖
想问一下加注释的这句话为什么不是if(x&&y&&z)
不应该是x,y,z同时不为0时才是找到了一个公共子序列吗,才应该自增1吗
求教谢谢
CPP
#include<bits/stdc++.h>
#define int long long
#define inf 1e18
#define inc 0xcfcfcfcf
#define N 157
#define M 27
#define mod 100000000
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
using namespace std;
int T=1,n,ecnt;
string a,b,c;
int la,lb,lc;
int nxta[N][M],nxtb[N][M],nxtc[N][M];
int f[N][N][N];
void Init_nxt(int nxt[N][M],int len,string x)
{
	for(int i=len-1;i>=0;--i)
	{
		for(int j=0;j<26;++j)
			nxt[i][j]=nxt[i+1][j];
		nxt[i][x[i+1]-'a']=i+1;
	}
}
int Dfs(int x,int y,int z)
{
	if(f[x][y][z]) return f[x][y][z];
	if(x||y||z)
		++f[x][y][z];
	for(int i=0;i<26;++i)
		if(nxta[x][i]&&nxtb[y][i]&&nxtc[z][i])
			f[x][y][z]=(f[x][y][z]+Dfs(nxta[x][i],nxtb[y][i],nxtc[z][i]))%mod;
	return f[x][y][z]%mod;
}
bool Solve()
{
 	//freopen("test.in","r",stdin);
	scanf("%lld",&n);
	cin>>a>>b>>c;
	la=a.size(),lb=b.size(),lc=c.size();
	a=" "+a,b=" "+b,c=" "+c;
	Init_nxt(nxta,la,a);
	Init_nxt(nxtb,lb,b);
	Init_nxt(nxtc,lc,c);
	printf("%lld\n",Dfs(0,0,0)%mod);
	return true;
}
signed main()
{
	//scanf("%lld",&T);
	while(T--)
		if(!Solve())
			printf("-1\n");
	return 0;
}
/*
*/


回复

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

正在加载回复...