\(\text{Problem}\)

给出一个字符串,求经过重新排列的另一个字典序最小的字符串,满足:相同的位置上

原串与结果串的字符不同。不存在则输出空串。

\(\text{Solution}\)

考虑从第一位开始枚举匹配

如果这位匹配(即两个都不相同)某个字符后可以判断出剩下的字符能否合法匹配

那这位就匹配这个字符即可

如何判断?

考虑剩下需要匹配的字符个数和还没用的字符个数

那么就可以建出一个网络流模型

每个字符拆成两个点

源点向 \(26\) 个字符连边,边权为还可用的个数

\(26\) 个字符向汇点连边,边权为还需要的个数

字符间连能匹配的点

判断是否满流即可

可以获得 \(90pts\)

\(\text{Code}\)

#include <cstdio>
#include <cstring>
#include <iostream>
#define re register
using namespace std; const int N = 5e4 + 5, M = 70, S = 54, T = 55;
char s[N];
int n, tot, h[M], cur[M], dep[M], Q[M], s1[N], s2[N];
struct edge{int to, nxt, w;}e[M * M];
inline void add(int x, int y, int z){e[++tot] = edge{y, h[x], z}, h[x] = tot;} inline int bfs()
{
for(re int i = 0; i <= T; i++) cur[i] = h[i], dep[i] = 0;
int head = 0, tail = 1; Q[1] = S, dep[S] = 1;
while (head < tail)
{
int now = Q[++head];
for(re int i = h[now]; i; i = e[i].nxt)
{
int v = e[i].to;
if (dep[v] || !e[i].w) continue;
dep[v] = dep[now] + 1, Q[++tail] = v;
}
}
return dep[T];
}
int dfs(int x, int lim)
{
if (x == T || lim <= 0) return lim;
int flow = 0;
for(re int i = cur[x]; i; i = e[i].nxt)
{
cur[x] = i;
int v = e[i].to;
if (dep[v] != dep[x] + 1 || !e[i].w) continue;
int f = dfs(v, min(lim, e[i].w));
if (f <= 0) continue;
e[i].w -= f, e[i ^ 1].w += f, lim -= f, flow += f;
if (lim <= 0) break;
}
return flow;
}
inline int dinic()
{
int res = 0;
while (bfs()) res += dfs(S, N);
return res;
} inline int check(int y, int x)
{
if (!s1[y]) return 0;
tot = 1, memset(h, 0, sizeof h);
int total = 0;
--s1[y], --s2[x];
for(re int i = 0; i < 26; i++)
{
if (s1[i]) add(S, i, s1[i]), add(i, S, 0);
if (s2[i]) add(i + 26, T, s2[i]), add(T, i + 26, 0);
total += s2[i];
}
for(re int i = 0; i < 26; i++)
for(re int j = 0; j < 26; j++)
if (i ^ j) add(i, j + 26, N), add(j + 26, i, 0);
int flow = dinic();
if (flow >= total) return 1;
++s1[y], ++s2[x];
return 0;
} int main()
{
scanf("%s", s + 1), n = strlen(s + 1);
for(re int i = 1; i <= n; i++) ++s1[s[i] - 'a'], ++s2[s[i] - 'a'];
for(re int i = 1; i <= n; i++)
{
int fl = 0;
for(re int j = 0; j < 26; j++)
if (j != s[i] - 'a' && check(j, s[i] - 'a'))
{
printf("%c", j + 'a'), fl = 1;
break;
}
if (!fl) break;
}
}

正解则是加过判断速度

一个结论:完全匹配的充要条件是 \(\forall i \in \sum,f_i+g_i<=length\)

\(f,g\) 是这个字符可用个数和需要匹配个数,\(length\) 为总字符数

\(\text{Code}\)

#include <cstdio>
#include <cstring>
#include <iostream>
#define re register
using namespace std; const int N = 5e4 + 5;
char s[N];
int n, s1[50], s2[50]; inline int check(int y, int x, int len)
{
if (!s1[y]) return 0;
--s1[y], --s2[x];
int fl = 1;
for(re int i = 0; i < 26; i++)
if (s1[i] + s2[i] > len){fl = 0; break;}
if (fl) return 1;
++s1[y], ++s2[x];
return 0;
} int main()
{
scanf("%s", s + 1), n = strlen(s + 1);
for(re int i = 1; i <= n; i++) ++s1[s[i] - 'a'], ++s2[s[i] - 'a'];
for(re int i = 1; i <= n; i++)
{
int fl = 0;
for(re int j = 0; j < 26; j++)
if (j != s[i] - 'a' && check(j, s[i] - 'a', n - i))
{
printf("%c", j + 'a'), fl = 1;
break;
}
if (!fl) break;
}
}

JZOJ 3207.Orthogonal Anagram的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. [LeetCode] Valid Anagram 验证变位词

    Given two strings s and t, write a function to determine if t is an anagram of s. For example, s = & ...

  3. Leetcode Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...

  4. LeetCode 242 Valid Anagram

    Problem: Given two strings s and t, write a function to determine if t is an anagram of s. For examp ...

  5. 【POJ】3207 Ikki's Story IV - Panda's Trick

    http://poj.org/problem?id=3207 题意:一个圆上顺时针依次排列着标号为1-n的点,这些点之间共有m条边相连,每两个点只能在圆内或者圆外连边.问是否存在这些边不相交的方案.( ...

  6. 【09_242】Valid Anagram

    Valid Anagram My Submissions Question Total Accepted: 43694 Total Submissions: 111615 Difficulty: Ea ...

  7. 【leetcode❤python】242. Valid Anagram

    class Solution(object):    def isAnagram(self, s, t):        if sorted(list(s.lower()))==sorted(list ...

  8. 242. Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...

  9. (easy)LeetCode 242.Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...

  10. 【BZOJ】【3207】花神的嘲讽计划 I

    字符串Hash+可持久化线段树 好神奇的转化…… 蒟蒻一开始还去想AC自动机去了……然而由于a[i]的范围是小于等于n,怎么也想不出一个时间复杂度合理的方法 膜拜了题解0.0原来是字符串Hash! 首 ...

随机推荐

  1. 解决Linux使用deepin-wine跑qq,tim打不开文件所在文件夹

    前言 使用deepin-wine 跑qq,发现一个小bug 这里点击打开文件夹是没有效果的,包括在 tim 上也是这样 问题原因 出现这个问题是因为 deepin-wine 跑的 QQ,Tim 打开文 ...

  2. Windows server 2008 tomcat间歇性掉线关闭

    1.代码没有问题,已经正常运行一年. 2.近期无更新代码. 3.tomcat 无运行报错. 今天突然间歇性掉线次数很多,客户不停反应情况,这边一时从代码开始找,我问了下在场运维其他服务器系统有无此现象 ...

  3. HCIE Routing&Switching之MPLS静态LSP配置

    前文我们了解了MPLS基础理论部分,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16928096.html:今天我们来聊一聊MPLS静态LSP配置相关话题: ...

  4. 【Java SE】Day07 API、Scanner类、Random类、ArrayList类

    一.API 1.概述: API(Application Programming Interface),应用程序编程接口 Java API:程序员的字典,是类的说明文档 2.使用步骤 帮助文档:JDK_ ...

  5. 这玩意也太猛了!朋友们,我在此严正呼吁大家:端好饭碗,谨防 AI!

    你好呀,我是歪歪. 最近几天大火的 ChatGPT 你玩了吗? 如果你不知道它是个什么东西,那么我让它给你来个自我介绍: 说白了,就是一个可以对话的人工智能. 我开始以为就是一个升级版的"小 ...

  6. 成功解决pycharm 的setting中的Error occurred when installing package 'Keras'

    成功解决pycharm 的setting中的Error occurred when installing package 'Keras' 刚刚开始学习python在安装package上碰了不上壁. M ...

  7. (admin.E104) 'XXXX' must inherit from 'InlineModelAdmin'.

    代码: class CaseStepAdmin(admin.ModelAdmin): list_display = ('id', 'casetep', 'casedata', 'webcase', ' ...

  8. 2022年7月13日,第四组 周鹏 JAVA认识的第一天,附加一个用JS写的计算器代码

    心情:╭(╯^╰)╮ ╮(╯﹏╰)╭ (╯﹏╰)b 罒ω罒 |*´Å`)ノ ( Ĭ ^ Ĭ ) (ㄒoㄒ) o(╥﹏╥)o /(ㄒoㄒ)/~~ (〒︿〒) ┭┮﹏┭┮ ε(┬┬﹏┬┬)3 ε(┬┬﹏┬ ...

  9. 02-RTL代码分析思路

    RTL代码分析思路(这里不进行具体代码的分析) verilog文件是以.v结尾的 1 RTL代码示例 //Date : 2023-01-09 //E-mail : xxxxxx@163.com //c ...

  10. 从log4j切换到logback后项目无法启动

    1.背景 有个旧项目之前使用的是log4j2来打印日志的,因为某些原因,同事想换成logback. 换成logback改动也很简单,大致就一下2步: 删除log4j2.xml配置,新增logback. ...