钟长者P71解题报告
T1
【题目描述】
给你N个字符串,你每次可以选择其中一个字符串的一段前缀进行翻转,但是你必须保证这个前缀的长度是偶数。你可以进行无限次这样的操作,并且如果
两个字符串变得相同的时候,你就可以把这两个字符串都删除掉,问最后最少剩下多少个字符串?
【输出格式】
对于每组数据,一行一个整数代表答案。
【样例输入】
2
5
esprit
god
redotopc
odcpoter
dog
14
rats
live
stressed
to
act
as
star
desserts
of
evil
cat
sa
fo
ot
【样例输出】
3
0
【样例解释】
无。
【数据范围与规定】
对于40%的数据,字符串长度不超过8
对于100%的数据,1<=T<=11,字符串长度不超过50,1<=N<=50
#include <cstdio>
#include <cstring>
char s[][];
int t,n,ans,len[];
bool vis[][],del[]; inline void work(int x)
{
len[x]=strlen(s[x]);
--len[x];//长度若是单数,那么下面枚举到最后时会出现vis[负数]=true
for(int i=;i<len[x];i+=)
vis[x][s[x][i]-'a'+s[x][i+]-'a']=true;
++len[x];
} inline bool judge(int i,int j)
{
for(int k=;k<;++k)
if(vis[i][k]!=vis[j][k])
return false;
// printf("\n%s %s\n",s[i],s[j]);
if(len[i]&)
return s[i][len[i]-]==s[j][len[j]-];
return true;
} inline void clear()
{
ans=;
memset(vis,false,sizeof vis);
memset(del,false,sizeof del);
} int main()
{
freopen("kahuucino.in","r",stdin);
freopen("kahuucino.out","w",stdout);
scanf("%d",&t);
while(t--)
{
clear(); scanf("%d",&n);
for(int i=;i<=n;++i)
scanf("%s",s[i]); for(int i=;i<=n;++i)
work(i);//处理每个字符串的情况 /*
printf("\n");
for(int i=1;i<=n;++i)
printf("%d ",len[i]);
printf("\n");
*/ for(int l,i=;i<=n;++i)
{
if(del[i])continue;
for(int j=i+;j<=n;++j)
{
if(del[j]||len[i]!=len[j])continue;
if(judge(i,j))
{
// printf("\n%d %d\n",i,j);
del[j]=true;
ans+=;
break;
}
}
}
printf("%d\n",n-ans);
}
fclose(stdin);fclose(stdout);
return ;
}
/*
5
esprit
god
redotopc
odcpoter
dog 样例第一组数据解释:
redotopc -> cpot oder -> topcod er -> do cpoter -> odcpoter
最后剩3个 以连续两个字符为一个单位
*/
考试30分代码
/*
把字符串拆成有两个字母的组合
然后将这些组合按照字典序排起来,合到一起形成一个新的字符串
最后判断这个字符串有没有出现过
*/
#include <algorithm>
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <set> std::set<std::string> h;
std::string a[];
int getMin(std::vector<std::string> words)
{
int n=words.size(),ans=n;
h.clear();
for(int i=;i<n;++i)
{
int m=words[i].size();
std::string s="";
for (int j=;j*<m;++j)
{
char x=words[i][j*],y=words[i][j*+];
if(x>y)std::swap(x,y);
a[j]=x,a[j]+=y;
}
std::sort(a,a+m/);
for(int j=;j*<m;++j)s+=a[j];
if(m&)s+=words[i][m-];
if(h.find(s)==h.end())h.insert(s);
else h.erase(s),ans-=;
}
return ans;
} int main()
{
freopen("kahuucino.in","r",stdin);
freopen("kahuucino.out","w",stdout); int T,n,m;
std::string s;
std::vector<std::string> w;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
w.clear();
for(int i=;i<n;++i)
{
std::cin>>s;
w.push_back(s);
}
printf("%d\n",getMin(w));
}
fclose(stdin);fclose(stdout);
return ;
}
正解
T2
麻耶
【问题描述】
油库里是幻想乡特有的一种生物。每只油库里都有一个战斗力值和一个能量值。当两只油库里战斗时,总是战斗力值高的一位获胜。获胜者的战斗力值将变成(自己的原战斗力值-对手的战斗力值+对手的能量值)。败者将死去。若两者战斗力值一样,则同归于尽。
思考熊发现了很多油库里,他想知道通过互相战斗之后油库里中战斗力值+能量值最高的一个可能到达多少。你能帮他们求出来吗?
(假设除了考察的那只油库里之外,其他油库里之间不会发生战斗)
【输入格式】
第一行是一个整数N,代表当前有多少油库里。
接下来的N行, 每一行有两个整数u,v, 代表这只油库里的战斗力值和能量值。
【输出格式】
输出一个整数,代表油库里中战斗力值+能量值最高的一个能达到多少。
【样例输入】
2
1 2
2 1
【样例输出】
4
【样例解释】
无。
不是所有油库里都要打一遍!!!
本来自信满满能拿10分……………………
正解是贪心
题意描述不清……
以为是所有油库里都要打一遍
但是实际是可以随意选着搞,想和哪个打和哪个打……
#include <algorithm>
#include <complex>
#include <cstdio>
const int N=1e5+;
#ifdef Win32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
struct node{
int u,v;
}peo[N];
int n;
long long ans;
int read()
{
int n=,w=;register char c=getchar();
while(c<''||c>''){if(c=='-')w=-;c=getchar();}
while(c>=''&&c<='')n=n*+c-'',c=getchar();
return n*w;
}
bool cmp(const node &a,const node &b)
{
if(a.u==b.u)return a.v>b.v;
return a.u<b.u;
}
inline long long max(long long x,long long y)
{return x>y?x:y;}
int main()
{
freopen("zyougamaya.in","r",stdin);
freopen("zyougamaya.out","w",stdout);
n=read();
for(int i=;i<=n;++i)
{
peo[i].u=read();
peo[i].v=read();
ans=max(ans,(long long)peo[i].u+peo[i].v);
}
std::sort(peo+,peo+n+,cmp);
long long sum=;
for(int i=;i<=n;++i)
{
ans=max(ans,sum+peo[i].u+peo[i].v);
if(peo[i].u<peo[i].v)
sum+=peo[i].v-peo[i].u;
}
printf("%I64d",ans);//不能用define的LL,只能得10分
fclose(stdin);fclose(stdout);
return ;
}
正解
T3
思路:大模拟
注意细节!!!!!
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
char cmd[];
struct Node{
int son[],now,fa,type;
//儿子有哪些,现在到了第几个儿子,父亲是谁,是文件还是文件夹(1是文件,2是文件夹)
std::string s;
Node(){now=,fa=;}
}a[]; inline void del_file(int x)
{
a[x].fa=;
a[x].type=;
a[x].s=' ';
} void del_directory(int x)
{
a[x].fa=;
a[x].s=' ';
a[x].type=;
for(int i=;i<=a[x].now;++i)
{
if(a[a[x].son[i]].type==)
del_file(a[x].son[i]);
else del_directory(a[x].son[i]);
a[x].son[i]=;
}
a[x].now=;
} int main()
{
freopen("nacumegu.in","r",stdin);
freopen("nacumegu.out","w",stdout);
int n,now=-;//now:现在在哪个里面
scanf("%d",&n);
for(int i=;i<=n;++i)
{
// printf("\nGG\n");
scanf("%s",cmd);
switch(cmd[])
{
case 'c'://转换目录
std::cin>>a[i].s; if(a[i].s[]=='.')
{//向上一级
if(a[now].fa!=)
now=a[now].fa;
else printf("No parent directory!\n");
}
else
{//向下一级
for(int j=;j<=a[now].now;++j)
if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==)
{
now=a[now].son[j];
goto S;
}
printf("No such directory!\n");
}
// --i,--n;//没必要
continue; case 't'://新建文件 std::cin>>a[i].s;
for(int j=;j<=a[now].now;++j)
if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==)
{//已经有了
printf("File already exists!\n");
goto S;
}
a[now].son[++a[now].now]=i;
a[i].now=;
a[i].fa=now;
a[i].type=;
continue; case 'r'://删除 std::cin>>a[i].s;
if(strlen(cmd)<)
{//删除文件
for(int j=;j<=a[now].now;++j)
if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==)
{//有
del_file(a[now].son[j]);
a[now].son[j]=;
goto S;
}
printf("No such file!\n");
}
else
{//删除文件夹
for(int j=;j<=a[now].now;++j)
if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==)
{//有
del_directory(a[now].son[j]);
a[now].son[j]=;
goto S;
}
printf("No such directory!\n");
}
goto S; case 'm':
//新建文件夹
std::cin>>a[i].s;
for(int j=;j<=a[now].now;++j)
if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==)
{//已经有了
printf("Directory already exists!\n");
goto S;
}
a[now].son[++a[now].now]=i;
a[i].now=;
a[i].fa=now;
a[i].type=;
continue; case 'l'://输出目录下的文件及文件夹
for(int j=;j<=a[now].now;++j)
{
if(a[a[now].son[j]].s[]==' ')continue;
std::cout<<a[a[now].son[j]].s;
if(a[a[now].son[j]].type==)
printf(" <F>\n");
else printf(" <D>\n");
}
}
S: ;
}
fclose(stdin);fclose(stdout);
return ;
}
正解
钟长者P71解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 【题解】Luogu P5290 [十二省联考2019]春节十二响
原题传送门 每个点维护一个堆,表示这个点及其子树所需的每段内存的空间 搜索时从下向上做启发式合并堆中信息,最后根节点堆中所有内存空间之和就是答案 #include <bits/stdc++.h& ...
- 转:使用Goproxy解决golang.org模块无法下载的问题
原文https://studygolang.com/articles/22277?fr=sidebar 简介 Goproxy 中国完全实现了 Go 的模块代理协议.并且它是一个由中国备受信赖的云服务提 ...
- QRCode.js:使用 JavaScript 生成微信二维码
https://www.runoob.com/w3cnote/javascript-qrcodejs-library.html 什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 ...
- 关于SQL中SELECT *(星号)的危害论
听闻有许多人是禁止开发人员在SQL中使用SELECT *的,这里翻译一下StackOverflow的一篇提问,个人认为相当客观 [SELECT *]危害主要有以下几点: 给数据消费者传数据的低效.当你 ...
- How to do SSH Tunneling (Port Forwarding)
How to do SSH Tunneling (Port Forwarding) In this post we will see how ssh works?, what is SSH tunne ...
- 2019年Amazon AWS-Solutions-Architect-Professional考试最新题库(AWS SAP题库)带考试模拟器
大家好,由于最近自己备考Amazon AWS-Solutions-Architect-Professional考试,购买了以下链接的题库,并通过了考试 https://www.kaoguti.gq/A ...
- 部署基于maven的springboot项目到linux服务器上
目录 本地运行调试 导入数据库: 导入项目: 将项目打包: linux准备: 运行项目: 脚本运行 本地运行调试 导入数据库: 导入数据库的时候使用的是sqlYog导入navcat的脚本:由于两个应用 ...
- 如何用JS获取地址栏参数的方法
采用正则表达式获取地址栏参数: 写一个方法来进行正则匹配,同样也可以复用 function GetPar(name) { var reg = new RegExp("(^|&)&qu ...
- 使用PATH变量进行Linux权限升级技巧
0x00 前言 在解决了几个OSCP挑战之后,我们决定写一篇关于用于Linux权限升级的各种方法的文章,这对我们的读者在其渗透测试项目中有所帮助.在本文中,我们将学习“使用$path变量的各种方法”以 ...
- sklearn.model_selection 的train_test_split方法和参数
train_test_split是sklearn中用于划分数据集,即将原始数据集划分成测试集和训练集两部分的函数. from sklearn.model_selection import train_ ...