A 字符串修改
直接加或者减然后取模
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <cstring>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <map>
#include<iomanip>
#include <set>
#include <bitset>
#define INT_MINs -2000000000
#define INT_MAXs 1000000001
#define MID int mid=(l+r)/2
#define REP1(i,x,y) for(int i=x;i<y;i++)
#define REP2(i,x,y) for(int i=x;i<=y;i++)
#define ls (2*k)
#define rs (2*k+1)
#define lson l,mid,2*k
#define rson mid+1,r,2*k+1
#define lc u << 1
#define rc u << 1 | 1
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0);cin.tie(NULL);
#define pb(a) push_back(a)
#define pi acos(-1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod=998244353;
const int dx[8] = { 0,-1,0,1,-1,-1,1,1}, dy[8] = { 1,0,-1,0,-1,1,-1,1};
char str1[100005],a[100005];
void solve(){
int n;
cin>>n;
cin>>str1+1;
for(int i=1;i<=n;i++){
a[i]=str1[i]-'a';
}
for(int i=1;i<=n;i++){
if(i&1){
a[i]=(a[i]+i)%26;
}else{
a[i]=((a[i]-i)%26+26)%26;
}
}
for(int i=1;i<=n;i++){
cout<<(char)(a[i]+'a');
}
}
int main()
{
IOS;
solve();
return 0;
}
B 学姐的编码1.0
因为只有16个字符可以直接记录所有字符的位置,然后枚举所有可能,二分查找是否能找出满足的子串,可以贪心地想法知道每个字符选择的位置越前越好
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <cstring>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <map>
#include<iomanip>
#include <set>
#include <bitset>
#define INT_MINs -2000000000
#define INT_MAXs 1000000001
#define MID int mid=(l+r)/2
#define REP1(i,x,y) for(int i=x;i<y;i++)
#define REP2(i,x,y) for(int i=x;i<=y;i++)
#define ls (2*k)
#define rs (2*k+1)
#define lson l,mid,2*k
#define rson mid+1,r,2*k+1
#define lc u << 1
#define rc u << 1 | 1
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0);cin.tie(NULL);
#define pb(a) push_back(a)
#define pi acos(-1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod=998244353;
const int dx[8] = { 0,-1,0,1,-1,-1,1,1}, dy[8] = { 1,0,-1,0,-1,1,-1,1};
int id[200];
int a[20][1000005],b[20];
int cnt=0;
int c[20];
vector<string>vt;
string str1;
void dfs(int x,int end){
if(x==end){
if(cnt==0) return;
int k=-1;
string str2="";
for(int i=1;i<=cnt;i++){
int pos=lower_bound(a[c[i]]+1,a[c[i]]+1+b[c[i]],k)-a[c[i]];
k=a[c[i]][pos];
if(c[i]<10)
str2+=(char)(c[i]+'0');
else
str2+=(char)(c[i]-10+'A');
}
//cout<<str2<<endl;
if(k!=inf){
vt.push_back(str2);
//cout<<str2<<endl;
}
return;
}
c[++cnt]=x;
dfs(x+1,end);
cnt--;
dfs(x+1,end);
}
void solve(){
for(int i='0';i<='9';i++){
id[i]=i-'0';
}
for(int i='A';i<='F';i++){
id[i]=i-'A'+10;
}
int n;
//cin>>n;
cin>>str1;
int len=str1.size();
for(int i=0;i<len;i++){
a[id[str1[i]]][++b[id[str1[i]]]]=i;
}
for(int i=0;i<16;i++){
a[i][++b[i]]=inf;
}
dfs(0,16);
cout<<vt.size()<<endl;
}
int main()
{
IOS;
solve();
return 0;
}
C 学姐的编码2.0
跟B一样改一下输出就行了
sort(vt.begin(),vt.end());
len=vt.size();
for(int i=0;i<len;i++){
cout<<vt[i]<<endl;
}
D 迷阵
直接枚举下界,然后跑最短路,最多跑3000次最短路
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <cstring>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <map>
#include<iomanip>
#include <set>
#include <bitset>
#define INT_MINs -2000000000
#define INT_MAXs 1000000001
#define MID int mid=(l+r)/2
#define REP1(i,x,y) for(int i=x;i<y;i++)
#define REP2(i,x,y) for(int i=x;i<=y;i++)
#define ls (2*k)
#define rs (2*k+1)
#define lson l,mid,2*k
#define rson mid+1,r,2*k+1
#define lc u << 1
#define rc u << 1 | 1
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0);cin.tie(NULL);
#define pb(a) push_back(a)
#define pi acos(-1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod=998244353;
const int dx[8] = { 0,-1,0,1,-1,-1,1,1}, dy[8] = { 1,0,-1,0,-1,1,-1,1};
struct node{
int x,y,d;
bool operator<(const node &x)const{
return d>x.d;
}
};
int n;
int dis[105][105];
int a[105][105];
void dij(int k){
priority_queue<node>q;
memset(dis,inf,sizeof dis);
if(a[1][1]<k)
return;
dis[1][1]=0;
q.push({1,1,a[1][1]});
while(!q.empty()){
node q1=q.top();
q.pop();
for(int i=0;i<4;i++){
int xx=q1.x+dx[i],yy=q1.y+dy[i];
if(xx<0||xx>n||yy<0||yy>n||a[xx][yy]<k) continue;
//int maxx=max(q1.maxx,a[xx][yy]),minn=min(q1.minn,a[xx][yy]);
if(max(q1.d,a[xx][yy])<dis[xx][yy]){
dis[xx][yy]=max(q1.d,a[xx][yy]);
q.push({xx,yy,dis[xx][yy]});
}
}
}
}
void solve(){
cin>>n;
int k1=inf,k2=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j],k1=min(a[i][j],k1),k2=max(a[i][j],k2);
int maxx=inf;
for(int i=k1;i<=k2;i++){
dij(i);
maxx=min(maxx,dis[n][n]-i);
//cout<<dis[n][n]<<endl;
}
cout<<maxx<<endl;
}
int main()
{
IOS;
solve();
return 0;
}