JZOJ 4889 最长公共回文子序列(搜索)
来源:互联网 发布:centos yum 升级gcc 编辑:程序博客网 时间:2024/06/05 05:05
题目大意
求两个小写字母串(长度分别为n和m)的最长公共回文子序列。
1≤n≤100000,1≤m≤20
时间限制 1s
空间限制 233000K
解题思路
因为m特别小,所以我们可以暴力枚举第二个串上的每一个回文子序列,在判断是否在第一个串里出现过。
怎么判断是否出现过呢?首先预处理第一个串,pr[i][j]表示在第一个串第i位后面第j个字母首次出现的位置。
#include<cstdio>#include<cstring>#include<algorithm>#define maxm 26#define maxn 100006#define fr(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;int n,m,s,ans,last[28],pr[maxn][28];char st[maxn],sr[maxm],stt[maxm];void pre(){ int i,j; fr(j,1,26) last[j]=n+1; for(i=n;i>=0;i--) { fr(j,1,26) pr[i][j]=last[j]; if (i!=0) last[st[i]-'a'+1]=i; } return;}bool check(){ int i,j=0; fr(i,1,s) { j=pr[j][stt[i]-'a'+1]; if (j==n+1) return 0; if (stt[i]!=stt[s-i+1]) return 0; } return 1;}void dfs(int x){ if (x==m+1) { if (check()) ans=max(ans,s); return; } stt[++s]=sr[x]; dfs(x+1); --s; dfs(x+1); return;}int main(){ freopen("lcps.in","r",stdin); freopen("lcps.out","w",stdout); scanf("%s",st+1); scanf("%s",sr+1); n=strlen(st+1),m=strlen(sr+1); pre(); dfs(1); printf("%d\n",ans); return 0;}
0 0
- JZOJ 4889 最长公共回文子序列(搜索)
- 最长公共回文子序列
- 最长回文子串、回文子序列、公共子序列
- 最长公共子串、最长公共子序列、最长递增子序列、最长回文子串
- 最长公共子串、最长公共子序列、最长回文子串、最长回文子序列、回文子串个数
- IOI 回文词(最长公共子序列)
- NYOJ 37 回文字符串(类似最长公共子序列)
- NYOJ-37-回文字符串(最长公共子序列)
- POJ 1159 Palindrome(回文串,最长公共子序列)
- NYOJ 37 回文字符串 (lcs最长公共子序列)
- 1092 回文字符串(最长公共子序列)
- 【DP】 最长公共回文子序列
- 【jzoj4889】【最长公共回文子序列】【字符串】
- 最长公共回文子序列ah
- 回文字符串【最长公共子序列】【DP】
- 构造回文 && 最长公共子序列
- Jzoj4889 最长公共回文子序列
- 回文字符串-最长公共子序列
- 异常处理
- Web服务器怎么解析URL
- eclipse设置新建jsp文件默认字符编码为utf-8
- 安装Ubuntu分区方法
- 闲来无事,写了个简易计算器
- JZOJ 4889 最长公共回文子序列(搜索)
- 手把手编写自己的 PHP MVC 框架实例教程
- 测试小故事5:纠结与坦然
- poj2385
- 选择客栈 NOIP2011 提高组 Day1 T2
- 两道递推
- 如何用消息系统避免分布式事务?
- Spring Cloud构建微服务架构(一)服务注册与发现
- 2016.11.15 C语言常遇概念问题