Codeforces 1137B(kmp next数组构造)

为了物尽其用,Next求出最多有哪部分能重复使用,然后重复使用就行了……

const int maxn = 5e5 + 5;
char s[maxn], t[maxn];
int cnts0, cnts1, cntt0, cntt1;
int Next[maxn];

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> (s + 1) >> (t + 1);
    int lens = strlen(s + 1), lent = strlen(t + 1);

    for (int i = 1; i <= lens; i++) {
        if (s[i] == '1')    cnts1++;
        else    cnts0++;
    }

    Next[1] = 0;
    for (int i = 2, j = 0; i <= lent; i++) {
        while (j > 0 && t[i] != t[j + 1])   j = Next[j];
        if (t[i] == t[j + 1])   j++;
        Next[i] = j;
    }

    for (int i = Next[lent] + 1; i <= lent; i++) {
        if (t[i] == '1')    cntt1++;
        else    cntt0++;
    }

    for (int i = 1; i <= lent; i++) {
        if (t[i] == '1' && cnts1)   cout << 1, cnts1--;
        else if (t[i] == '0' && cnts0)  cout << 0, cnts0--;
    }
    int k = min(cntt0 ? cnts0 / cntt0 : inf, cntt1 ? cnts1 / cntt1 : inf);
    while (k--) {
        for (int i = Next[lent] + 1; i <= lent; i++) {
            if (t[i] == '1')    cout << 1, cnts1--;
            else    cout << 0, cnts0--;
        }
    }
    while (cnts1--) cout << 1;
    while (cnts0--) cout << 0;

    return 0;
}

原文地址:https://www.cnblogs.com/AlphaWA/p/10699473.html

时间: 2024-10-14 04:59:55

Codeforces 1137B(kmp next数组构造)的相关文章

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(

Codeforces 346C Number Transformation II 构造

题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #define N 100010 #define L(x) (x<<1) #define R(x) (x<<

利用后缀数组构造后缀树

由于蒟蒻azui前段时间忙着准备省选,并在省选中闷声滚大粗,博客停更了好久.. 省选过后整个人各种颓,整天玩玩泥巴什么的... 前段时间学后缀数组的时候上网查相关资料,看到说后缀数组和后缀树是可以相互转化的,并且uoj上有大量通过后缀自动机建出后缀树然后dfs遍历获得后缀数组的模板,但是通过后缀数组来建后缀树的资料确实稀缺. 也许大牛们都觉得这xjbYY一下就可以写了,所以网上没找到对应的代码,那么我来补个坑吧.大牛勿喷.. 先谈谈我的理解吧.. 讲道理后缀数组和后缀树应该是完全等价的,但前两者

HDOJ3336 Count the string 【KMP前缀数组】+【动态规划】

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4212    Accepted Submission(s): 1962 Problem Description It is well known that AekdyCoin is good at string problems as well as n

编程算法 - 数组构造二叉树并打印

数组构造二叉树并打印 本文地址: http://blog.csdn.net/caroline_wendy 数组: 构造二叉树, 需要使用两个队列(queue), 保存子节点和父节点, 并进行交换; 打印二叉树, 需要使用两个队列(queue), 依次打印父节点和子节点, 并进行交换; 二叉树的数据结构: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pParent; BinaryTreeNode* m_pLeft; BinaryT

字符串匹配KMP next数组的理解

#include<cstdio> #include<cstring> void getNext(int *Next,char* src){ int i,j; Next[0]=-1; i=0; j=-1; int N=strlen(src); while(i<N-1){ if(j==-1||src[i]==src[j]){ ++i; ++j; Next[i]=j; }else{ /* 理解难点:假设已经存在Next:假设是两个字符串在进行比较. 1. a)现在有两个字符串 sr

后缀数组构造

读了罗穗的论文,终于知道后缀数组怎么构造了,还反复打了五遍,打得很痛苦才最终理解. 终于体会到XY的痛苦了.实在是一篇OI生涯中最难懂的代码orz看来两天.一下是经过稍微加长的稍微易理解的代码(其实差不多好吧). 具体注释看 网址 1 #include<cstdio> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 6 struct suffix_array 7 { 8 const l

// codeforces 471D // kmp初学

// codeforces 471D // #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int n,w; int a[200005],b[200005]; int da[200005],db[200005]; int nex

POJ-3450 Corporate Identity (KMP+后缀数组)

Description Beside other services, ACM helps companies to clearly state their "corporate identity", which includes company logo but also other signs, like trademarks. One of such companies is Internet Building Masters (IBM), which has recently a