校内测试-密码破解
题目:
主要算法 : 字符串(模式匹配)
题干:
文章翻译
应试策略:
- 刚开始认为规则是样例。结果发现样例是错误的,有‘y’没有按照规则修改
- 最后问了格式,对于一篇文章如果有一个长度为1的单词,那么就只有‘I’与‘a’这两种情况,因为a比较容易判断,只需要前面和后面是空格就行,这样贪心得了100分,其它打正解的还没有我跑得快,但是如果不存在冠词a的情况,就WA了
代码
#include<stdio.h> #include<stdlib.h> #include<iostream> #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout); #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++ using namespace std; inline int read(); char buf[100000],*pa,*pb; string s; int cnt=1; int len; int main() { File("whos"); getline(cin,s),len=s.size(); string fs=" "; int sp=s.find(fs,0); while(sp!=-1) { if(s[sp+1]>='a'&&s[sp+1]<='z'&&s[sp+2]==' ') { cnt=s[sp+1]-'a'; break; } sp++; sp=s.find(fs,sp); } for(int i=0;i<len;i++) { if(s[i]>='a'&&s[i]<='z') { if(s[i]-cnt<'a') s[i]+=26; printf("%c",s[i]-cnt); } else if(s[i]>='A'&&s[i]<='Z') { if(s[i]-cnt<'A') s[i]+=26; printf("%c",s[i]-cnt); } else printf("%c",s[i]); } return 0; } inline int read() { register int x(0),f(1);register char c(gc); while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc; while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc; return x*f; }
非完美算法:
模拟
正解:
- 先看题哈
- 找出出现频率最大的字母,然后与E之间制定规则,将所有字母按照规则输出
总结:
- 能不能先看题