zoukankan      html  css  js  c++  java
  • Maximum Questions CodeForces

    大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$能匹配最多的不相交的$t$.

    先不考虑最少替换的限制, 要尽量多的匹配$t$, 可以先预处理出可以匹配的位置, 然后$dp$.

    要求最小的话, 每次$dp$转移时可能有多个转移点, 对每个dp值维护一个前缀最小值即可.

    #include <iostream>
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <math.h>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    #include <string.h>
    #include <bitset>
    #define REP(i,a,n) for(int i=a;i<=n;++i)
    #define PER(i,a,n) for(int i=n;i>=a;--i)
    #define hr putchar(10)
    #define pb push_back
    #define lc (o<<1)
    #define rc (lc|1)
    #define mid ((l+r)>>1)
    #define ls lc,l,mid
    #define rs rc,mid+1,r
    #define x first
    #define y second
    #define io std::ios::sync_with_stdio(false)
    #define endl '
    '
    #define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int P = 1e9+7, INF = 0x3f3f3f3f;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
    ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
    inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
    //head
    
    
    
    #ifdef ONLINE_JUDGE
    const int N = 1e6+10;
    #else
    const int N = 111;
    #endif
    
    int n, m;
    char s[N];
    int a[2][N], b[2][N], f[N], dp[N], w[N], c[N];
    void init() {
    	REP(i,1,n) {
    		a[0][i]=a[0][i-1],a[1][i]=a[1][i-1];
    		b[0][i]=b[0][i-1],b[1][i]=b[1][i-1];
    		if (s[i]=='a') a[i&1][i]=max(a[i&1][i],i);
    		else if (s[i]=='b') b[i&1][i]=max(b[i&1][i],i);
    		w[i]=w[i-1]+(s[i]=='?');
    	}
    }
    
    int main() {
    	scanf("%d%s%d", &n, s+1, &m);
    	init();
    	REP(i,m,n) {
    		if (m&1) f[i]=b[i&1][i]<=i-m&&a[i&1^1][i]<=i-m;
    		else f[i]=a[i&1][i]<=i-m&&b[i&1^1][i]<=i-m;
    	}
    	REP(i,m,n) {
    		if (f[i]) {
    			dp[i] = dp[i-m]+1;
    			c[i] = c[i-m]+w[i]-w[i-m];
    			if (dp[i]==dp[i-1]) c[i]=min(c[i],c[i-1]);
    		}
    		else c[i]=c[i-1];
    		dp[i] = max(dp[i-1], dp[i]);
    	}
    	int ans = INF;
    	REP(i,1,n) if (dp[i]==dp[n]) ans=min(ans,c[i]);
    	printf("%d
    ", ans);
    }
    
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/uid001/p/10751238.html
Copyright © 2011-2022 走看看