zoukankan      html  css  js  c++  java
  • 【洛谷八连测R6】yanQval-不可逆的重启动

    题目描述

    为了逃离无穷的轮回,Okabe和Suzuha踏上了回到1975的道路。Time machine剩余的燃料不多了,必须尽可能的利用好。燃料的利用可以用两个字符串 $A$ 和 $B$ 来表示,如果存在一个串 $S$,满足 $S$ 同时是两个串的子序列,则 $S$ 就是对燃料的合法利用,现在想知道最长能找出来多长的 $S$。

    输入输出格式

    输入格式:

    两行,一行一个字符串,分别表示 $A$ 和 $B$。

    输出格式:

    一行一个整数,表示$S$ 的长度。

    输入输出样例

    输入样例#1: 复制
    abcdefghijklmnopqrstuvwxyz
    bbddee
    输出样例#1: 复制
    3

    说明

    对于30%的数据,满足 $|A|,|B| leq 10$

    对于70%的数据,满足 $|A|,|B| leq 1000$

    对于100%的数据,满足 $|A| leq 10^{6},|B| leq 1000$,所有字符都是小写字母。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=1e6+5;
    const int maxm=1e3+5;
    int a[maxn],b[maxn],head[30],nxt[maxn][30],f[maxm][maxm];
    int main(){
        int n=0,m=0; char ch;
        while(ch=getchar(),ch!='
    ') a[++n]=ch-'a';
        while(ch=getchar(),ch!='
    ') b[++m]=ch-'a';
        memset(head,0x3f,sizeof(head));
        for(int i=n;i>=0;--i){
            for(int j=0;j<26;++j)
            nxt[i][j]=head[j];
            head[a[i]]=i;
        }
        memset(f,0x3f,sizeof(f));
        for(int i=0;i<=m;++i) f[i][0]=0;
        for(int i=1;i<=m;++i)
        for(int j=1;j<=i;++j){
            f[i][j]=f[i-1][j];
            if(f[i-1][j-1]<=n)
            f[i][j]=min(f[i][j],nxt[f[i-1][j-1]][b[i]]);
        }
        int ans=0,l=0,r=m;//这儿暴力判断也行的
        while(l<=r){
            int mid=(l+r)>>1;
            if(f[m][mid]<=n){ans=mid; l=mid+1;}
            else r=mid-1;
        }
        printf("%d
    ",ans);
        return 0;
    }
            
    欢迎转载,转载请注明出处!
  • 相关阅读:
    算法--将Excel列索引转换成默认标识
    Java参考资料-中文API
    java编程规范
    POI-根据Cell获取对应的String类型值
    将Excel中读取的科学计数法表示的Double数据转换为对应的字符串
    Android进程间通信之LocalSocket通信
    Android进程间通信之socket通信
    android用讯飞实现TTS语音合成 实现中文版
    Android Junit测试框架
    java interface的两个经典用法
  • 原文地址:https://www.cnblogs.com/huihao/p/7751560.html
Copyright © 2011-2022 走看看