题目:
有时候程序员有很奇怪的方法来隐藏他们的口令。
Billy"Hacker"Geits会选择一个字符串S(由L个小写字母组成,5<=L<=100,000),然后他把S顺时针绕成一个圈。
如字符串cbadfa,绕成一个圈后,我们认为字符串首尾相连。
每次取其中一个字母作为起始字母,并顺时针依次取字母而组成一个字符串。这样将得到一些字符串。
比如字符串cbadfa,按照以上规则取出的字符串有:
cbadfa badfac adfacb dfacba facbad acbadf
我们找到最小的那个字符串,可知为acbadf,也可知道它的第一个字符'a'在原字符串cbadfa中为第6个字符(位置从1开始),
将得到的结果6减1得到5,这就是我们需要的口令。
再比如字符串alabala,绕成一个圈后,每次取其中一个字母作为起始字母,并顺时针依次取字母而组成一个字符串。这样将得到一些字符串:
alabala labalaa abalaal balaala alaalab laalaba aalabal
我们找到最小的那个字符串,可知为aalabal,它的第一个字母'a'在原字符串中位置为7,7-1=6,则6为口令。
注:如果按照规则有两个字符串都是最小的,则取前面那一个。
要点总结:
用i、j两个指针指向两个不同的起始地址,一开始为0和1,用k记录两个地址开始相同的元素个数。遍历起始地址,如果两个指针的相同就把k++,如果一个大于另一个,则大的那个可以跳k+1步再去遍历了找小的,因为跳过的这些位置上必然没有j位置上的串更小。
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
int l;
cin>>l;
string s="";
char c;
while(s.size()<l){
cin>>c;
if(c=='/n') continue;
s+=c;
}
int i=0,j=1,k=0;
while(i<l&&j<l&&k<l){
char a=s[(i+k)%l];
char b=s[(j+k)%l];
if(a==b){
k++;
}else{
if(a>b){
i+=k+1;
}
if(a<b){
j+=k+1;
}
if(i==j) j++;
k=0;
}
}
cout<<min(i,j);
return 0;
}
题目:
在程序设计中,对字符串的处理是经常遇到的一个问题。
例如,将字符串中所有的英文字母变成大写,或者将一个字符串与另一个字符串连接构成一个新的字符串。
由于此类的操作非常普遍,因此,在设计程序语言的时候,设计者就已经把这类操作的代码写好了,如果编程人员要使用这些代码,只需把该类代码的头文件包含到自己的程序中,编程人员就可以很简单的调用,这样使编程节省了不少时间。
明明是一名项目经理,他现在负责一种新的程序设计语言的开发,现在需要预先实现大量的和处理字符串有关的功能方法,以后这些方法会包含到程序设计语言中,方便程序语言使用者的开发。你是明明手下的一名软件工程师,明明分配给你一个任务,在两个字符串中,找到一个字符串在另一个字符串中的起始位置。 例如,有两个字符串,一个字符串s= "abc",另一个字符串subs="bc",现在就要找出"bc"在"abc"中的其实位置,在这个例子中,"bc"的起始位置为2。
明明的问题可以归结为:输入两串字符串s和subs,求s中subs的起始位置。
要点总结:
字符串长度不长时可以使用朴素模式匹配,KMP算法比较繁琐。每次主串和模式串指针都回溯,暴力遍历求解即可。
代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s,subs;
int index=-1;
while(cin>>s>>subs){
index=-1;
for(int i=0;i<=s.size()-subs.size();i++){
bool match=true;
for(int j=0;j<subs.size();j++){
if(s[i+j]!=subs[j]){
match=false;
break;
}
}
if(match){
index=i;
break;
}
}
if(index!=-1){
cout<<index+1<<endl;
}else{
cout<<0<<endl;
}
}
return 0;
}
题目:
大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是"6"+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。
现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?
要点总结:
送分的
代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
cin>>n;
string s;
while(cin>>s){
string res="6";
for(int i=6;i<=10;i++){
res+=s[i];
}
cout<<res<<endl;
}
return 0;
}
英语翻译:
程序是告诉计算机在数据上进行什么操作的一系列有序指令。程序可以内置于硬件本身,也可以以软件的形式独立存在。在一些专用或称专门用途的计算机中,操作指令嵌入在其电路中。常见的例子是计算器、手表、汽车引擎还有微波炉中的微型计算器。另一方面,对于一般用途的计算机来说,即使它们在只读存储器中包含一些内置的程序或者在处理器芯片上包含一些指令,它们仍依赖于外部程序来执行有效任务。一旦计算机程序被编写好,它在任何时候都只能按照软件控制运行。用途广泛的软件包括一系列应用程序---即给计算机如何执行各种各样任务的指令。
人们正在积极研究使用众多有前景的新型科技制造计算机,例如光学计算机,DNA计算机,神经计算机,还有量子计算机。大多数计算机都是普遍通用的,能够执行任何计算功能,只由其内存容量和计算速度所限制。然而,对于特定的任务,不同的计算机设计所带来的表现天差地别。例如,量子计算机可以通过量子分解快速破解某些现代加密算法。
计算机会严格按照人们编写的程序解决问题,而不关心效率、可代替方案、可能的捷径、代码中可能存在的错误。能够学习并适应的计算机属于新兴的人工智能和机器学习领域的一部分。人工智能类的产品大体上有两种分类,基于规则的系统以及模式识别系统。基于规则的系统试图表现人类专家指定的规则,并且其开发往往是昂贵的。模式识别系统利用针对问题的数据生成结论。模式识别系统的例子包括语音识别、字体识别、翻译以及在线营销这样的新兴领域。
ROM 只读存储器
optical computer 光学计算机
Rule-based system 基于规则的系统
Pattern recognition system 模式识别系统
