题目很明显了,最长公共子序列。但是构建映射的时候我用了multimap结果超时。。。。。
直接用hash就好,因为范围不大,就26个字母。
还有一点要吐槽的是我把两个串的索引写反了 竟然提醒我RE而不是WA 结果一道水题优化了一下午。
我真是去年买了个表
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int dp[1005][1005];
bool Hash[130][130];
int main()
{
int T;
scanf("%d",&T);
for(int Case=1;Case<=T;Case++)
{
memset(Hash,0,sizeof(Hash));
char strx[1005],strm[1005];
scanf("%s%s",strx,strm);
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
char ch1[2],ch2[2];
scanf("%s%s",ch1,ch2);
Hash[ch1[0]][ch2[0]]=1;
}
int lenx=strlen(strx),lenm=strlen(strm);
for(int i=0;i<lenx;i++)
{
for(int j=0;j<lenm;j++)
{
if(strx[i]==strm[j]||Hash[strm[j]][strx[i]])
{
dp[i][j]=i-1<0||j-1<0?1:dp[i-1][j-1]+1;
}
else
{
int x1=i-1<0?0:dp[i-1][j];
int x2=j-1<0?0:dp[i][j-1];
dp[i][j]=max(x1,x2);
}
}
}
if(dp[lenx-1][lenm-1]==lenx)
printf("Case #%d: happy\n",Case);
else
printf("Case #%d: unhappy\n",Case);
}
}