比赛 4043级NOIP2022欢乐赛6th 评测结果 AAAAAAAAAAAAAAA
题目名称 基因串 最终得分 100
用户昵称 nick 运行时间 1.074 s
代码语言 C++ 内存使用 4.55 MiB
提交时间 2022-11-18 21:36:06
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int maxn=300+10;
int n,k,f[maxn][maxn],e[maxn][maxn],dp[maxn][maxn];
int main()
{
	freopen("gen.in","r",stdin);
	freopen("gen.out","w",stdout); 
    cin>>n;
  	for(int i=1;i<=n;i++)
  	{
  	    string s;
        cin>>s;
        f[s[1]-'A'+1][s[2]-'A'+1]|=1<<(s[0]-'A'+1);
    }
  	cin>>k;
  	while(k--)
  	{
    	memset(e,0,sizeof(e));
    	memset(dp,0x3f,sizeof(dp));
    	string s;
    	cin>>s;
    	int stlen=s.length();
    	for(int i=0;i<=stlen-1;i++)
    	{
    	  	if(s[i]=='S') dp[i+1][i+1]=1;
    	  	e[i+1][i+1]|=(1<<(s[i]-'A'+1));
    	}
    	for(int len=0;len<=stlen-1;len++)
    	{
    	  	for(int l=1;l+len<=stlen;l++)
    	  	{
    	    	int r=l+len;
    	    	for(int k=l;k<=r-1;k++)
    	    	{
    	      		dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
    	      		for(int x=1;x<=26;x++)
    	     		 	for(int y=1;y<=26;y++)
    	        			if((e[l][k]&(1<<(x)))&&(e[k+1][r]&(1<<(y))))
    	        	  			e[l][r]|=f[x][y];
    	    	}
    	    	if(e[l][r]&(1<<('S'-'A'+1)))dp[l][r]=1;
    	  	}
    	}
    	if(dp[1][stlen]>=0x3f3f3f3f) cout<<"NIE"<<endl;
    	else cout<<dp[1][stlen]<<endl;
  	}
}