名字听起来十分厉害啊...一道lzz的提交答案题。

提答题,我们看看题目,给出一个解密程序,叫你加密。

每个点有一个加密的sample和一些要加密的文本。

从题目中我们可以得到一些信息:

加密后一般为8/16个一组,字符集|S|=95。

那就来看数据吧。

Data 1

奥妙重重...overwatch是什么鬼啊

咦第一行15个字符,加密完120个字符。怕是8位ascii?

写完一测,样例挂了。

然后去完那个解密器,随手输了8位,invalid output?但是sample确实是1位=>8位啊。

后面想想,可能只是一个映射,不一定是ascii,反正有sample。我真是傻逼

测了测sample,发现里面95个字符都有,然后就没有了。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
map<char,string> mpp;
int main()
{
ifstream fin("toodifficult1_simple.in");
ifstream fin2("toodifficult1_simple.out");
string s,s2;
while(getline(fin,s))
{
getline(fin2,s2);
int j=0;
for(int i=0;i<s.length();i++)
{
string rp;
for(int k=j;k<j+8;k++) rp.push_back(s2[k]);
j+=8;
mpp[s[i]]=rp;
}
}
ifstream qwq("toodifficult1.in");
freopen("toodifficult1.out","w",stdout);
while(getline(qwq,s))
{
for(int i=0;i<s.length();i++) cout<<mpp[s[i]];
putchar(10);
}
}

Data 2

咦那个aaaaa...aaaa怎么看起来这么鬼畜啊...怕是有什么肮脏的****。

似乎是二进制减一?数一数,似乎是16位一分割。

咦那个一串一串的16个1是啥啊...懵逼

然后我们拉到第一行最后...咦最后有一大坨1,数一数好像是25*16个1...

excited!似乎和字母有关。

好像这里思路就中断了...玩玩那个解密程序好了。

input:400个1 output:""

input:15个0+401个1 output:"a"

嗯这很正常。

input:16个1+15个0+385个1 output:"b"

咦,shenmegui,难道这是分割字母的?

input:15个0+17个1+15个0+385个1 output:Invalid

哦好像是下标?

input:15个0+17个1+14个0+1+0+384个1 output:"ab"

input:14个0+1+0+16个1+15个0+385个1 output:"ba"

后缀数组!不同开头的后缀中间插16个1!

那么我们只要写一个暴力就行了233

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <algorithm>
#include <stdlib.h>
#include <string>
using namespace std;
char s[233333];
int rp[233333];
bool cmp(int a,int b)
{
for(int x=0;;++x)
{
if(s[a+x]!=s[b+x]) return s[a+x]<s[b+x];
}
return 0;
}
int main()
{
freopen("toodifficult2.in","r",stdin);
freopen("toodifficult2.out","w",stdout);
string str;
while(getline(cin,str))
{
strcpy(s,str.c_str());
int n=str.size();
for(int i=0;i<n;i++) rp[i]=i;
sort(rp,rp+n,cmp);
int cur='a';
for(int i=0;i<n;i++)
{
int r=rp[i]+1,p=s[rp[i]];
while(cur<p) printf("1111111111111111"), ++cur;
int rs[16];
for(int k=0;k<16;k++) rs[k]=r%2, r/=2;
for(int k=15;k>=0;k--) putchar(rs[k]+48);
}
while(cur<'z') printf("1111111111111111"), ++cur;
putchar(10);
}
}

Data 3

这输入是什么卵子啊...怎么这么乱啊...似乎是随机字符?

咦输出好像是64位啊...这是啥啊...是个整数?

咦输入可能也是整数?95进制?题目里还给了字符集?真刺激

S="a bcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,./\?;:'"<>[]{}()|-_=+*&^%$#@!`~"

试试95进制然后转二进制?看了看好像不太像。

然后就gg了。(接下来去看了题解

woc要把这些大数分解质因数!pollard-rho!

然后把小的因数放在前面输出就行了。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
char gg[2333];
string S="a bcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,./\\?;:'\"<>[]{}()|-_=+*&^%$#@!`~";
typedef long long ll;
ll mul(ll a,ll b,ll n)
{
ll ans=0;
while(b)
{
if(b&1) ans=ans+a, ans%=n;
a=(a+a)%n; b>>=1;
}
return ans;
}
ll f(ll x,ll n)
{
return (mul(x,x,n)+1)%n;
}
ll gcd(ll a,ll b) {if(a<0) a=-a; if(b<0) b=-b; return b?gcd(b,a%b):a;}
ll rho(ll n)
{
ll x=2, y=2, p=1;
while(p==1)
{
x=f(x,n);
y=f(f(y,n),n);
p=gcd(x-y,n);
}
return p;
}
int main()
{
freopen("toodifficult3.in","r",stdin);
freopen("toodifficult3.out","w",stdout);
for(int i=0;i<S.size();i++) gg[S[i]]=i;
string s;
while(getline(cin,s))
{
long long r=0;
for(int i=0;i<s.size();i++) r=r*95+gg[s[i]];
ll a=rho(r),b=r/a;
if(a>b) swap(a,b);
int rs[32];
for(int k=0;k<32;k++) rs[k]=a%2, a/=2;
for(int k=31;k>=0;k--) putchar(rs[k]+48);
for(int k=0;k<32;k++) rs[k]=b%2, b/=2;
for(int k=31;k>=0;k--) putchar(rs[k]+48);
putchar(10);
}
}

Data 4

太毒了...待补

Data 5

喂出题人!MD5是什么鬼啊!不是吧

咦说好MD5呢怎么sample的out里面全是10010啥的...

然后去玩checker,发现可以输入字符串啊!然后checker确实会返回正确的字符串md5。

咦,这01串怕是有什么交易...咦第一个点输出好像长得差不多...我把所有东西压成一行当第一个点丢给checker解密好了。

真刺激,以下是解密后的全文(人工换行):

As you know, it's too difficult to solve this case.

So I will give you some problems, you just need to answer them.

All of the answers of these problems only consist of lower-case letters and numbers.

No.1 What do I like to play?

No.2 There is a poem including these words "gouliguojiashengsiyi", and then?

No.3 Who wrote this poem?

We often call the Mobius function mu(n).f(n)=sum (i=1 to n) mu(i).

No.4 Please work out the minimum of f(n) when n belongs to [1,10^9].

No.5 Please work out the maximum of f(n) when n belongs to [1,10^9].

No.6 The last problems may be the most difficult problem of this contest.

Can you work out C(6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666,

2333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333) mod (1e100+7) ?

咦怎么只有6个问题...哦原来4和5两个问题分比较多。

No.1 overwatch(233

No.2 qiyinhuofubiquzhi(excited

No.3 jiangzemin(吃枣药丸

然后丢进checker一测,好像答案不对?md还要用第一题的那个加密程序啊

然后发现No.3 还是不对...后面想想好像是linzexu...(果然姿势水平不够高

接下来两个问题是什么卵子啊...梅滕斯函数的极值?我**怎么知道啊

暴力硬肛的话...除了空间都没什么问题。

额其实我们可以开三个bitset,每个10^9存质数和mu...

然后这样是过不了编译的...但是我们可以new...大概分配了4G内存,然后跑线筛,跑了200s,答案跑出来了...跑得电脑黑汗水流

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <time.h>
#include <map>
#include <bitset>
using namespace std;
#define MAXN 1000000000
int *ps,pn=0;
bitset<10000000001> np;
bitset<10000000001> *hm_;
bitset<10000000001> *ms_;
void shai()
{
long long qzh=1;
bitset<10000000001>&hm=*hm_;
bitset<10000000001>&ms=*ms_;
np[1]=1; hm[1]=1; ms[1]=1;
long long maxn=1, minn=1;
for(int i=2;i<=MAXN;i++)
{
if(!np[i]) {ps[++pn]=i; hm[i]=1; ms[i]=0;}
for(int j=1;j<=pn&&ps[j]*i<=MAXN;j++)
{
int p=ps[j]*i; np[p]=1;
if(i%ps[j]) hm[p]=hm[i], ms[p]=!ms[i];
else {hm[p]=0; break;}
}
if(hm[i]) qzh+=(ms[i])?1:-1;
maxn=max(maxn,qzh);
minn=min(minn,qzh);
if(i&131071);else cout<<i<<","<<minn<<","<<maxn<<" left"<<(1000000000*(clock()/(double)i)-clock())/1000.0<<"s\n";
}
cout<<minn<<","<<maxn<<"\n";
}
#define S2 80000000
int main()
{
cout<<"准备分配"<<(sizeof(np)*3+sizeof(int)*S2)/1024.0/1024.0/1024.0<<"GB内存!\n";
ps=new int[S2];
cout<<"进度33%\n";
hm_=new bitset<10000000001>();
cout<<"进度66%\n";
ms_=new bitset<10000000001>();
cout<<"进度100%\n";
shai();
}

接下来No.6的话...woc这...如果电脑上没有python的话还是算了吧QAQ

......答案果然是no。

最后输出用的东西

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
map<char,string> mpp;
int main()
{
ifstream fin("toodifficult1_simple.in");
ifstream fin2("toodifficult1_simple.out");
string s,s2;
while(getline(fin,s))
{
getline(fin2,s2);
int j=0;
for(int i=0;i<s.length();i++)
{
string rp;
for(int k=j;k<j+8;k++) rp.push_back(s2[k]);
j+=8;
mpp[s[i]]=rp;
}
}
ifstream qwq("toodifficult5_u.out");
freopen("toodifficult5.out","w",stdout);
while(getline(qwq,s))
{
for(int i=0;i<s.length();i++) cout<<mpp[s[i]];
putchar(10);
}
}

Q:不行啊,考场机子一共就不到4G内存,那个点怎么做啊wtf

A:暴搜啊...不是给了checker吗...反正答案估计就不是很大...随便搜搜

(UPD:刚才测了测暴搜,跑得十分的慢啊,就不贴上来了...而且还时不时出个bug啥的...不过如果在程序中直接内嵌一个算md5的代码应该会快很多把)

然后这样就有80分啦23333这提答真是刺激啊

toodifficult 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Android UX & UI 最佳实践: 设计有效的导航

    Best Practices for User Experience & UI Designing Effective Navigation 导航:帮助用户有效直观地使用你的应用. Plann ...

  2. Xcode cannot launch because the device is locked.

    When you plug in your iPhone, it will ask you to trust the computer. If you already trust and unlock ...

  3. php.ini配置解析

    为了让PHP读取这个文件,它必须被命名为'php.ini'. PHP 查找配置文件次序:当前工作目录:环境变量PHPRC  ; 指明的路径:编译时指定的路径.  ; 在windows下,编译时的路径是 ...

  4. Linux 学习001

    遇到的问题一: xxx is not in the sudoers file.This incident will be reported.的解决方法 1.切换到root用户下,怎么切换就不用说了吧, ...

  5. iOS 读取相册二维码,兼容ios7(使用CIDetector 和 ZXingObjC)

    ios从相册读取二维码,在ios8以上,苹果提供了自带的识别图片二维码的功能,这种方式效率最好,也是最推荐的,但是如果你的系统需要向下兼容ios7,就必须用其他方式. 这里我选择的是 ZXingObj ...

  6. android 设置布局横屏竖屏

    只要在AndroidManifest.xml里面配置一下就可以了.在AndroidManifest.xml的activity(需要禁止转向的activity)配置中加入android:screenOr ...

  7. [转载]利用@media screen实现网页布局的自适应,@media screen and

    开始研究响应式web设计,CSS3 Media Queries是入门.Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变内 ...

  8. [转]jqGrid 属性、事件全集

    本文转自:http://blog.csdn.net/rosanu_blog/article/details/8334070 以下是jqGrid 最常用的属性和事件,经过一段时间的整理,终于弄的差不多了 ...

  9. 基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)

    hi 感觉论文开题基本确定了,凯森 1.MySQL -----自定义函数----- ----基本 两个必要条件:参数和返回值(两者没有必然联系,参数不一定有,返回一定有) 函数体:合法的SQL语句:以 ...

  10. Java实现点击一个控件实现删除一个控件的方法

    最近在做项目的时候需要处理点击一个JLabel实现删除这一个JLabel的功能.最近折磨了一点时间,查了一下API.找到2个方法可以实现这个功能. remove public void remove( ...