A

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll LLmaxn = 2e18;
string a;
int K;
string str[];
int pop = ;
map<string, int> mp;
int main()
{
cin >> a;
cin >> K;
for (int i = ; i <= && pop < K; i++)
{
for (int j = ; j < a.size(); j++)
{
if (a[j] == 'a' + i)
{
string now = "";
for (int k = j; k < min((int)a.size(), j + K); k++)
{
now += a[k];
if (!mp[now])
{
str[++pop] = now;
//cout<<now<<endl;
mp[now]++;
}
}
}
}
}
sort(str + , str + pop + );
cout << str[K] << endl;
return ;
}

B

给1-N的一个排列 再给你M个Xi,Yi表示Xi与Yi位置的数可以无限次交换

解:

并查集 因为交换次数是无线的所以在一个集内的数字可以到其他任何一个位置

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll LLmaxn = 2e18;
const int N = ;
int par[N];
void init(int n)
{
for (int i = ; i <= n; i++)
{
par[i] = i;
}
}
int find(int x)
{
return par[x] == x ? x : par[x] = find(par[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x != y)
{
par[x] = y;
}
}
int num[N];
int where[N];
int a, b;
int main()
{
int n;
int m;
cin >> n;
cin >> m;
init(n);
int anser = ;
for (int i = ; i <= n; i++)
{
cin >> num[i];
where[num[i]] = i;
}
for (int i = ; i <= m; i++)
{
cin >> a >> b;
unite(a,b);
}
for (int i = ; i <= n; i++)
{
if (find(where[i]) == find(i))
{
anser++;
}
}
cout << anser << endl;
return ;
}

C

有2N个球 一半是白的 一半是黑的 每个白球和黑球上都有一个数字 分别都可以组成1-N

在一次操作内你可以交换相邻的两个球 问你最少需要多少次操作使得从左到右 白球和黑球各自都是递增序

解:

dp[i][j]表示现在在(i+j)的位置有1-i白球且1-j黑球正确排序所需要的最少操作数

pre[kind][i][j]表示第kind种的球在第i个位置及之前标号不小于j的有几个

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll LLmaxn = 2e18;
const int N = 2e3 + ;
int n;
int s;
int dp[N][N];
int pos[][N];
int pre[][N * ][N];
void init()
{
for (int kind = ; kind <= ; kind++)
{
for (int i = ; i < s; i++)
{
for (int j = n - ; j >= ; j--)
{
pre[kind][i][j - ] += pre[kind][i][j];
}
}
for (int i = ; i < s - ; i++)
{
for (int j = ; j < n; j++)
{
pre[kind][i + ][j] += pre[kind][i][j];
}
}
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
dp[i][j] = INT_MAX;
}
}
dp[][] = ;
}
int main()
{
cin >> n;
s = n * ;
for (int i = ; i < s; i++)
{
string ch;
cin >> ch;
int kind = ;
int x;
cin >> x;
x--;
if (ch[] == 'W')
{
kind = ;
}
pos[kind][x] = i;
pre[kind][i][x]++;
}
init();
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (i < n)
{
int p = pos[][i];
dp[i + ][j] = min(dp[i + ][j], dp[i][j] + pre[][p][i + ] + pre[][p][j]);
}
if (j < n)
{
int p = pos[][j];
dp[i][j + ] = min(dp[i][j + ], dp[i][j] + pre[][p][i] + pre[][p][j + ]);
}
}
}
cout << dp[n][n] << endl;
return ;
}

最新文章

  1. LINUX磁盘分区、格式化、挂载、卸载全程详解
  2. SQL server2000更改数据库名称
  3. .NET 配置项扩展
  4. Routine
  5. swift错误和异常处理
  6. H5课程大纲
  7. 一个简单的SNTP客户端
  8. Android 程序打包和安装过程
  9. BZOJ3806: Neerc2011 Dictionary Size
  10. context.Response.End()的用法和本质
  11. select源码分析(linux2.6.11)
  12. Hibernate(四)——缓存策略+lazy
  13. JAVA中GridBagLayout布局管理器应用详解
  14. 如何使用Sencha touch 构建基于Cordova的安卓项目
  15. 【读书笔记】iOS-UI Automation 需要遵守的规则
  16. Google 和 Facebook 如何大规模处理 IT 事件管理 —— 2016 SRE 大会之我见
  17. Ubuntu下登陆远程postgresql数据库
  18. java基础----&gt;使用Itext生成数据库文档
  19. 《Python绝技:运用Python成为顶级黑客》 用Python刺探网络
  20. POJ 2763 Housewife Wind LCA转RMQ+时间戳+线段树成段更新

热门文章

  1. 字典的常见操作&lt;二&gt;
  2. delphi ASCII码表及键盘码表
  3. java:Spring框架2(bean的作用域,静态工厂和实例工厂,自动装配,动态代理)
  4. lnmp 环境下 部署 laravel 项目
  5. python基础--面向对象之封装
  6. C++复习练习题:1-1000的完数
  7. USACO1.6 Number Triangles [dp-简单dp]
  8. TCP端口扫描
  9. 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式
  10. ocelot集成consul服务发现