需要能熟练使用有关于unordered_set的函数,比如:定义unordered_set<string>p s.substr(l,r) p.count() p.insert()
#include <iostream>
#include <cstring>
#include <unordered_set>
using namespace std;
int main(){
int n;
string s;
cin>>n>>s;
for(int i=1;i<=n;i++){
bool f=true;
unordered_set<string>q;
for(int j=0;j+i<=n;j++){
auto c=s.substr(j,i);
if(q.count(c)){
f=false;
break;
}
q.insert(c);
}
if(f){
cout<<i<<endl;
break;
}
}
return 0;
}
string:
- 添加字符:a+=to_string(xx%k);
- 复制字符串的值:string b=a;
- 翻转字符串:reverse(b.begin(),b.end());
- 比较字符串:a==b;
stack:
stack<int> st:
创建一个名为st
的整数类型栈对象,用于存储整数值。st.push(xx % k):
将变量xx
对k
取模后的结果压入栈st
中。push
操作会将元素添加到栈的顶部。st.top():
返回栈st
顶部元素的引用,但不会移除该元素。若栈为空,调用top()
可能导致未定义行为(通常崩溃或异常)。st.pop():
移除栈st
顶部的元素。此操作仅删除元素,不返回其值。若栈为空,调用pop()
可能导致未定义行为。
Tips:模块化思想在编程时不容易乱,比如先定义一个函数确定在该进制下是否是回文数,再定义一个check函数判断是否满足在二到十进制里头是否有至少两个进制是回文数。
#include <iostream>
#include <stack>
using namespace std;
int n,s;
bool check(int x,int k){
int xx=x;
stack<int>st;
while(xx){
st.push(xx%k);
xx/=k;
}
while(!st.empty()){
if(st.top()!=x%k){
return false;
}
st.pop();//
x/=k;
}
return true;
}
bool chack(int x){
int cnt=0;
for(int i=2;i<=10;i++)cnt+=check(x,i);
return cnt>=2;
}
int main(){
cin>>n>>s;
while(n){
s++;
if(chack(s)){
cout<<s<<endl;
n--;
}
}
return 0;
}
因为题目是要求相邻整数之间的差值相等的最长序列,所以可以用差分数组先对各个整数之间的差值进行存储,然后用双指针。用双指针注意要及时更新指针位置(尤其是i指针)以及控制指针位置防止越界(尤其是j指针),还有因为第一个数的差值是本身,因此对于只有一个数字的情况要进行特判。
#include <iostream>
using namespace std;
const int N=200012;
#define int long long
int a[N]={0},b[N]={0};
signed main(){
int t;
cin>>t;
for(int x=1;x<=t;x++){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i]-a[i-1];
}
int res=0;
if(n==1){
res=1;
}else{
for(int i=2;i<=n;i++){
int j=i+1;
while(b[j]==b[j-1]&&j<=n)j++;
res=max(res,j-i+1);
i=j-1;
}
}
printf("Case #%d: %d\n",x,res);
}
return 0;
}
偏思维,谁能想到数列也能和二进制扯上关系呢!(此处以二进制的01状态代表该权重所代表的数是否存在),其实题目也是有提示的。比如“请你求出这个序列的第 N项的值(N用 10进制数表示,从 1开始)”,正常应该就是给个n的值就可以了啊!!!大意了!!!但真的好困啊!!!
while(n){
res+=n%2*base;
base*=k;
n/=2;
}//很细的操作
#include <iostream>
using namespace std;
int main(){
int k,n;
cin>>k>>n;
int res=0,base=1;
while(n){
res+=n%2*base;
base*=k;
n/=2;
}
cout<<res;
return 0;
}