zoukankan      html  css  js  c++  java
  • Luogu P1944 最长括号匹配

    Luogu P1944 最长括号匹配

    显然是一道 DP。

    设 $f_i$ 为以第 $i$ 位结尾的最长括号匹配子串的长度。

    则当 s[i-f[i-1]-1]s[i] 匹配时,$f_i=f_{i-1}+2+f_{i-f_{i-1}-2}$。$f_{i-f_{i-1}-2}$ 表示这个匹配之前可能存在的一个匹配的长度。

    特别注意的是,不要在 for 循环里写 strlen(s),这样每次循环的时候都要计算一次,会有三个点超时。

    代码实现如下:

    #include<bits/stdc++.h>
    #define N 1000010
    
    int ans,pos;
    int f[N];
    char s[N];
    
    namespace WalkerV {
    	void Read() {
    		scanf("%s",s);
    		return;
    	}
    
    	void Solve() {
    		int len=strlen(s);
    		for(int i=0;i<len;i++) {
    			if(s[i]==')') {
    				if(s[i-f[i-1]-1]=='(') {
    					f[i]=f[i-1]+2+f[i-f[i-1]-2];
    				}
    			}
    			if(s[i]==']') {
    				if(s[i-f[i-1]-1]=='[') {
    					f[i]=f[i-1]+2+f[i-f[i-1]-2];
    				}
    			}
    			if(ans<f[i]) {
    				ans=f[i];
    				pos=i;
    			}
    			//printf("f[%d]:%d
    ",i,f[i]);
    		}
    		return;
    	}
    
    	void Print() {
    		//printf("%d %d
    ",ans,pos);
    		for(int i=pos-ans+1;i<=pos;i++) {
    			printf("%c",s[i]);
    		}
    		printf("
    ");
    		return;
    	}
    }
    
    int main()
    {
    	WalkerV::Read();
    	WalkerV::Solve();
    	WalkerV::Print();
    	return 0;
    }
    
  • 相关阅读:
    kernel_size
    pytorch:修改预训练模型
    Python yield使用浅析
    respberry2b + android5.1
    android中调用c++文件并转为so
    图像灰度化
    图像的高斯平滑滤波
    历届试题 分考场
    头发啊头发
    历届试题 合根植物
  • 原文地址:https://www.cnblogs.com/luoshui-tianyi/p/15377229.html
Copyright © 2011-2022 走看看