比赛 |
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;
}
}