2018HN多校
http://acm.hi-54.com/contest_problemset.php?cid=1455
A : 摩斯密码
时间限制:1 Sec 内存限制:128 MiB
提交:202 答案正确:82
题目描述
题目描述:
摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。为了简单问题,去除所有的标点符号。
现在给你一段摩斯密码,请你把它们进行解密。
输入
含有T(T<=20)组数据,每组数据包含一段摩斯密码(由字符 '.' 和 '-' 以及 空格组成,连续空格个数不超过两个),每段占一行(不超过1000个字符),现在请你对他们进行解密;
输出
输出对应的解密后的结果(所有解密结果如果是英文字母一律输出小写英文字母),保证结果仅包含 数字 空格 字母。
样例输入
5
..
. .
. ..
. ..
.. .-.. --- ...- . -.-- --- ..-
样例输出
i
ee
ei
e i
i love you map跑一发,但不知道为啥格式错误最后随便改了改A了。
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL unsigned long long
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f map<string,char>M;
void init(){
M[".-"]='a';M["-..."]='b';M["-.-."]='c';M["-.."]='d';
M["."]='e';M["..-."]='f';M["--."]='g';M["...."]='h';
M[".."]='i';M[".---"]='j';M["-.-"]='k';M[".-.."]='l';
M["--"]='m';M["-."]='n';M["---"]='o';M[".--."]='p';
M["--.-"]='q';M[".-."]='r';M["..."]='s';M["-"]='t';
M["..-"]='u';M["...-"]='v';M[".--"]='w';M["-..-"]='x';
M["-.--"]='y';M["--.."]='z';
M["-----"]='';M[".----"]='';M["..---"]='';M["...--"]='';
M["....-"]='';M["....."]='';M["-...."]='';M["--..."]='';
M["---.."]='';M["----."]='';
}
char s[];
int main()
{
LL n,m,i,j,k,t;
init();
cin>>t;
getchar();
while(t--){
string ans="";
string tmp="";
gets(s);
LL l=strlen(s);
for(i=;i<l;++i){
if(s[i]==' '){
ans+=M[tmp];
tmp="";
if(s[i+]==' '){
i++;
ans+=' ';
}
}
else{
tmp+=s[i];
}
}
ans+=M[tmp];
for(int i=;i<ans.length();++i){
if(isalpha(ans[i])){
ans[i]=tolower(ans[i]);
}
}
cout<<ans<<endl;
}
return ;
}
题目描述
输入
输出
若存在“简单环路”输出“Yes”,否则输出“No”。
样例输入
3 4
AAAA
ABCA
AADA
样例输出
No
判断一个图中是否有环,刚开始想的用dfs感觉写起来很麻烦,最后用的并查集,每个格子看作一个点,注意一条边并一次就好,
发现两个同类点在一个集合中说明有环。
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL unsigned long long
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f
LL MOD=1e9+; char s[][];
int e[][]; int f[];
int getf(int v){
return f[v]==v?v:f[v]=getf(f[v]);
}
LL t,n,m,i,j,k;
struct Edge{
int u,v,w;
}P[];
int gid(int x,int y){
return (x-)*m+y;
}
int main()
{ while(cin>>n>>m){
memset(e,,sizeof(e));
for(i=;i<=n*m;++i) f[i]=i;
for(i=;i<=n;++i) cin>>s[i]+;
bool ok=;
for(i=;i<=n;++i){
for(j=;j<=m;++j){
if(s[i][j]==s[i][j-]){
int u=gid(i,j),v=gid(i,j-);
int fu=getf(u),fv=getf(v);
if(fu!=fv){
f[fv]=fu;
}
else{
ok=;
break;
}
}
if(s[i][j]==s[i-][j]){
int u=gid(i,j),v=gid(i-,j);
int fu=getf(u),fv=getf(v);
if(fu!=fv){
f[fv]=fu;
}
else{//cout<<i<<' '<<j<<" "<<fu<<" "<<fv<<endl;
ok=;
break;
}
}
if(ok) break;
}
if(ok) break;
}
ok?puts("Yes"):puts("No");
}
return ;
} /*
.. .-.. --- ...- . -.-- --- ..---
*/
C直接模拟。
题目描述
输入
输出
输出最小的正子段和
样例输入
3
-1 2 3
样例输出
1
贪心,考虑一下这段序列的和 sum[i,j]=SUM{a[i]+a[i+1]+...+a[j]},我们的目标是 MIN{sum[i,j]},也可以改写成MIN{pre[j]-pre[i-1]},转化成了前缀和的形式,问题转化为找到两个前缀和pre[a]和pre[b]满足 a<b且pre[a]<pre[b] 的最小的pre[b]-pre[a],对处理好的pre[]数组排序,枚举右边界i,如果i-1满足条件那显然i-1就是当前最优的,如果i-1不满足条件,在i-1前面有满足条件的k,那么让i-1和k配对会使得结果更优,所以我们只考虑相邻的点就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
pair<LL,int>sum[];
int a[];
int main()
{
int n,i,j;
cin>>n;
LL ans=;
for(i=;i<=n;i++) cin>>a[i];
for(i=;i<=n;i++) {
sum[i].first=sum[i-].first+a[i];
sum[i].second=i;
}
sort(sum+,sum++n);
if(sum[].first>)ans=sum[].first;
for(i=;i<=n;i++) {
if(sum[i].first>) ans=min(ans,sum[i].first);
if(sum[i].second>sum[i-].second && sum[i].first!=sum[i-].first) ans=min(ans,sum[i].first-sum[i-].first);
}
if(ans!=) cout<<ans<<endl;
else puts("no solution");
return ;
}
题目描述
输入
输出
输出联通块的期望值,答案的数据可能很大,所以输出答案乘2^(n-1)后再对1e9+7取模
样例输入
1
2
样例输出
3
提示
来源
直接根据题意列出来联通快个数分布律图,答案就是 { Σni=1(i*C(n-1,i-1)) }%1e9+7,由于组合数推到用到了除法需要取逆元,这里n不是很大,直接线性推导,inv[i]=(mod-mod/i)*inv[mod%i]%mod;记得中间取模防爆。
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL unsigned long long
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f
LL MOD=1e9+;
LL inv[]={,};
int main()
{
LL t,n,m,i,j,k;
for(i=;i<;++i)
inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
LL ans=;
LL r=;
for(i=;i<n;++i){
r=r*(n-i)%MOD*inv[i]%MOD;
ans+=(i+)*r;
ans%=MOD;
}
cout<<ans<<endl;
}
return ;
}
题目描述
我们把f(i)表示为i的正约数的和,而我们要求的是1<=i<=n之间所有i的f(i)之和!
输入
输出
输出一个数字,表示所求的数。
样例输入
3
5
12
2018
样例输出
21
127
3350309
1--n中因子x的个数就是floor(n/i);
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL unsigned long long
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f
LL MOD=1e9+; LL cal(int n){
LL r=n;
for(int i=;i<=n;++i){
r+=(n/i)*i;
}
return r;
}
int main(){
int n,i,j,k;
cin>>k;
while(k--){
scanf("%d",&n);
printf("%lld\n",cal(n));
}
return ;
}
题目描述
输入
输出
输出对女朋友的最小刺激值;结果占一行。
样例输入
2
4 2
20 1
10 1
30 2
40 2
6 2
20 1
10 1
30 2
40 2
50 3
60 3
样例输出
30
100 贪心,考虑每个时间x,在这个时间点能销毁的软件的时间属性必须>=x,大的时间肯定不会影响小时间,倒序往堆里push节点每次pop队首就好了。
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL unsigned long long
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f
LL MOD=1e9+; struct node{
int a,b;
bool operator<(const node& tmp)const{
return a<tmp.a;
}
}P[];
bool cmpb(node A,node B){
return A.b>B.b;
}
priority_queue<node>q;
int main()
{
LL t,n,m,i,j,k;
cin>>t;
while(t--){
while(!q.empty()) q.pop();
scanf("%lld%lld",&n,&m);
LL sum=,ans=;
for(i=;i<=n;++i){
scanf("%d%d",&P[i].a,&P[i].b);
sum+=P[i].a;
}
sort(P+,P++n,cmpb);
for(i=m,j=;i>=;--i){
while(j<=n&&P[j].b>=i)
q.push(P[j++]);
if(!q.empty()){
ans+=q.top().a;
q.pop();
}
}
cout<<sum-ans<<endl;
}
return ;
}
H-dp+矩阵幂
原题bzoj1009,只不过这道题限制了可以转移的字母状态
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<time.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define debug puts("debug")
#define LL long long
#define ULL unsigned long long
#define uint unsigned int
#define pii pair<int,int>
#define eps 1e-10
#define inf 0x3f3f3f3f char s1[],s2[];
LL mod=(LL)<<;
struct matrix{
int len;
LL a[][];
matrix(){
memset(a,,sizeof(a));
}
matrix operator*(matrix& tmp){
matrix ans;
ans.len=len;
for(int i=;i<=len;++i){
for(int j=;j<=len;++j){
for(int k=;k<=len;++k){
ans.a[i][k]+=a[i][j]*tmp.a[j][k];
ans.a[i][k]%=mod;
}
}
}
return ans;
} void show(){
puts("------------------------------------");
for(int i=;i<=len;++i){
for(int j=;j<=len;++j){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
puts("------------------------------------");
}
}A,I;
matrix qpow(matrix X,int n){
matrix ans=I;
while(n){
if(n&) ans=ans*X;
X=X*X;
n>>=;
}
return ans;
}
int t,n,m,i,j,k;
int f[];
void solve(){
int l1=strlen(s1+),l2=strlen(s2+);
A.len=I.len=l2;
memset(A.a,,sizeof(A.a));
for(i=;i<=l2;++i) I.a[i][i]=;
f[]=,f[]=;
for(i=;i<=l2;++i){
j=f[i-];
while(j&&s2[j]!=s2[i-]) j=f[j];
f[i]=j+;
}
for(i=;i<l2;++i){
for(j=;j<=l1;++j){
k=i+;
while(k&&s1[j]!=s2[k]) k=f[k];
A.a[i][k]++;
A.a[i][k]%=mod;
}
} A.a[l2-][l2]=;
//A.show();
matrix ans=qpow(A,n);
LL res=;
for(i=;i<l2;++i) res=(res+ans.a[][i])%mod;
cout<<res<<endl;
}
int main(){ scanf("%d",&t);
while(t--){
scanf("%d%s%s",&n,s1+,s2+);
solve();
}
return ;
}
/*
3
3
ab
ab
4
acd
ca 5
ab
aaa
*/
I,b-a;
题目描述
每个人 都有自己独有的计数方式 比如以下 字符串111123455可以表示为4个1,1个2,1个3,1个4,2个5.为了方便记忆就表示为4--1,1--2,1--3,1--4,2--5当然顺序肯定不能变换 计数方式可以表示为“a--b”的形式 在计数方式中相连的b互不相等且a与b不为0 独有的计数方式 如果转化为字符串 字符串的长度小于10的9次方
给你下面的计数方式 例如5--4也就是字符串44444,10--4也就是字符串4444444444
给你这样的计数方式 判断这个字符串中有多少连续子串所构成的整数是4的倍数
例如5--4可表示为字符串44444里面共有(4,4,4,4,4,44,44,44,44,444,444,444,4444,4444,44444)15个是4的倍数;
输入
第一行是数字T(T<1000)<t<100) 表示下面有t组实例<="" h3="">
每一行一个独有的计数方式 长度小于100
<t<100) 表示下面有t组实例<="" h3="">
输出
输出字符串中有多少个是4的倍数 占一行
样例输入
4
5--4
1--1,1--2
2--4,2--2,2--3
1--4,1--3,1--2,1--1
样例输出
打表查一下4的倍数的数字会发现规律,对于个位数,只有4/8是4的倍数,对于多位数,如果个位是奇数那他不可能是4的倍数,
如果
个位数是0/4/8,那十位数只有是偶数,这个数才是4的倍数;如果个位数是2/6那么十位数只有是奇数这个数才是4的倍数。
知道规律就简单了,记录下pre表示前面几段有多少个数字,枚举一下当前段的数字,奇数不管,2/6就加上pre,4/8根据前面的
数的奇偶性分情况讨论一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
#define uint unsigned int LL a[],b[];
char s[];
int main()
{
int i,j,k,t; scanf("%d",&t);
getchar();
while(t--){
int tot=;
gets(s);
LL ans=,pre=; LL n=strlen(s),tmp=;
s[n]=',';
for(i=;i<=n;++i){
if(isdigit(s[i])){
tmp=tmp*+(s[i]-'');
}
else if(s[i]=='-'){
i++;
tot++;
a[tot]=tmp;
tmp=;
}
else if(s[i]==','){
b[tot]=tmp;
tmp=;
}
}
for(i=;i<=tot;++i){ if(b[i]==||b[i]==){
if(b[i-]%==){
ans+=pre;
}
}
else if(b[i]==||b[i]==){
if(b[i-]%==){
ans+=a[i]*(pre+pre+a[i]+)/;
}
else{
ans+=a[i]*(pre+pre+a[i]+)/;
ans=ans-pre;
}
}
pre+=a[i];
}
cout<<ans<<endl;
}
return ;
}
2018HN多校的更多相关文章
- 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap
一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- NTP校时设置
一.Windows Server 2008 – Time Server 前言: 国家时间与频率标准实验室 && NTP服务器 也可以忽略1~6 直接跳7 如果已改过机码请使用 1 ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- 2016暑假多校联合---Windows 10
2016暑假多校联合---Windows 10(HDU:5802) Problem Description Long long ago, there was an old monk living on ...
- 2016暑假多校联合---Substring(后缀数组)
2016暑假多校联合---Substring Problem Description ?? is practicing his program skill, and now he is given a ...
- 2016暑假多校联合---To My Girlfriend
2016暑假多校联合---To My Girlfriend Problem Description Dear Guo I never forget the moment I met with you. ...
- 2016暑假多校联合---A Simple Chess
2016暑假多校联合---A Simple Chess Problem Description There is a n×m board, a chess want to go to the po ...
- HDU 5792---2016暑假多校联合---World is Exploding
2016暑假多校联合---World is Exploding Problem Description Given a sequence A with length n,count how many ...
随机推荐
- Oracle下回滚rollback的使用
oracle中可以设置一个回滚点进行回滚 设置回滚名称 savepoint pointa ; 进行回滚 rollback to pointa; 如果期间有删除的数据就回来了
- 理论实践:循序渐进理解AWR细致入微分析性能报告
1. AWR 概述 Automatic Workload Repository(AWR) 是10g引入的一个重要组件.在里面存贮着近期一段时间内(默认是7天)数据库活动状态的详细信息. AWR 报告是 ...
- sqlserver如何读写操作windows系统的文件
DECLARE @object int DECLARE @hr int DECLARE @src varchar(255), @desc varchar ...
- Qt::QWindow多窗口争抢置顶状态解决方案
有时候我们会有这种需求,自己的桌面程序需要置顶,但是程序包含了很多窗口,可能我们要求窗口1,2都在其它桌面程序之上,但是窗口1必须随时在窗口2之上. Qt提供的置顶方式是在windowsflags上增 ...
- Day04 dom详解及js事件
day04 dom详解 DOM的基础 Document对象 Element对象 Node对象 innerHTML 事件处理 表单验证 上次课内容回顾: JS中ECMAScript用法: JS定义变 ...
- android 控件加圆角
1.新建一个radius_border.xml <shape xmlns:android="http://schemas.android.com/apk/res/android&quo ...
- 基因芯片与NGS区别[转载]
转自:http://blog.sina.com.cn/s/blog_40d4ae110101fjzy.html 1 二代测序与基因芯片的区别与优缺点. 生物芯片相对第二代测序而言,优势在于价格便宜,便 ...
- Selenium之firefox浏览器的启动
1.编写如下代码 import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; /** ...
- [golang note] 协程基础
协程概念 √ 协程通常称为coroutine,在golang中称为goroutine. √ 协程本质上是一种用户态线程,它不需要操作系统来进行抢占式调度,在实际实现中寄存在线程之中. √ 协程系统开销 ...
- rest-framework框架的基本组件
快速实例 Quickstart 大致步骤 (1)创建表,数据迁移 (2)创建表序列化类BookSerializer class BookSerializer(serializers.Hyperlink ...