【NOIP2018模拟赛2018.10.3】track

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/82933617

题目

在这里插入图片描述
在这里插入图片描述


题解

–开始以为和那个什么括号匹配一样,结果要判重,(QAQ)
结果其实是kmp字符串匹配
设f[i][j][k]:第i秒时,高度为j,成功匹配第k个的方案数
状态转移方程式
if(s[k]==‘U’){
f[i+1][j+1][k+1]=(f[i+1][j+1][k+1]+f[i][j][k])%mod;
if(j)f[i+1][j-1][fail[k][0]]=(f[i+1][j-1][fail[k][0]]+f[i][j][k])%mod;
}
else{
f[i+1][j+1][fail[k][1]]=(f[i+1][j+1][fail[k][1]]+f[i][j][k])%mod;
if(j)f[i+1][j-1][k+1]=(f[i+1][j-1][k+1]+f[i][j][k])%mod;
}

f[i+1][j+1][l]=(f[i+1][j+1][l]+f[i][j][l])%mod;
if(j)f[i+1][j-1][l]=(f[i+1][j-1][l]+f[i][j][l])%mod;

其中fail[k][0]表示用D匹配失败时可以满足的前缀是多长
fail[k][1]表示用U匹配失败时可以满足的前缀是多少

剩下的就是kmp处理fail数组,像我一样的蒟蒻还是只有手算模拟
好像也可以用暴力
不管了
反正就是玄学


代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=205;
const int mod=1000000007;

int t;
char s[MAXN];
int l;
long long f[MAXN][MAXN][MAXN];
int next[MAXN];
int fail[MAXN][2];

void calc(){
	int k=0;
	for(int i=1;i<l;i++){
		while(k&&s[k]!=s[i])
			k=next[k];
		if(s[k]==s[i])
			k++;
		next[i+1]=k;
	}
	fail[0][s[0]=='U']=1;
	for(int i=1;i<=l;i++){
		k=i;
		while(k&&s[k]!='U')
			k=next[k];
		fail[i][1]=k+1;
		if(!k&&s[0]=='D')
			fail[i][1]=0;
		k=i;
		while(k&&s[k]!='D')
			k=next[k];
		fail[i][0]=k+1;
		if(!k&&s[0]=='U')
			fail[i][0]=0;
	}
}

int main(){
//	freopen("track.in","r",stdin);
//	freopen("track.out","w",stdout);
	cin>>t;
	cin>>s;
	l=strlen(s);
	calc();
	f[0][0][0]=1;
	for(int i=0;i<t;i++)
		for(int j=0;j<=min(i,t-i);j++){
			for(int k=0;k<l;k++){
				if(s[k]=='U'){
					f[i+1][j+1][k+1]=(f[i+1][j+1][k+1]+f[i][j][k])%mod;
					if(j)
						f[i+1][j-1][fail[k][0]]=(f[i+1][j-1][fail[k][0]]+f[i][j][k])%mod;
				}
				else{
					f[i+1][j+1][fail[k][1]]=(f[i+1][j+1][fail[k][1]]+f[i][j][k])%mod;
					if(j)
						f[i+1][j-1][k+1]=(f[i+1][j-1][k+1]+f[i][j][k])%mod;
				}
			}
			f[i+1][j+1][l]=(f[i+1][j+1][l]+f[i][j][l])%mod;
			if(j)
				f[i+1][j-1][l]=(f[i+1][j-1][l]+f[i][j][l])%mod;
		}
	cout<<f[t][0][l];
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/82933617