题解来源:https://blog.csdn.net/qq_51282224/article/details/130560102
题单:https://codeforces.com/gym/104354/attachments/download/20061/statements_2.pdf
题目:https://codeforces.com/gym/104354/my
/
方便记忆
/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
/*
这个题关键点就是 知道a串最多有26个字母,超过26个字母一定会重复
同时注意,一旦发生重复后边也一定会重复,记得break
还要要特判一下s长度为1的情况
*/
using namespace std;
// 判断回文
bool check(string s)
{
for(int i = 0, j = s.size() - 1; i < j; i ++, j --)
if(s[i] != s[j]) return false;
return true;
}
void solve()
{
string s; cin >> s;
vector<int> cnt(26, 0); //容器cnt存26个数据 初始化0,,数据下标0~25;
//cout<<cnt[0]<<" "<<cnt[25]<<" ";
if(s.size() == 1) {
cout << "NaN\n";
return ;
}
// 最多26个字母,st代表后边回文字符串的开始位置
for(int st = 1; st <= 26; st ++)
{
// 之前的计数
int t = s[st - 1] - 'a';
// 判断是否重复, 重复直接break
if(cnt[t]) {
break;
}
cnt[t] ++;
// 检查是否回文
if(check(s.substr(st))) //从下标st开始 复制到s中
{
cout << "HE\n";
return;
}
}
cout << "NaN\n";
}
int main()
{
int T; cin >> T;
while(T --) solve();
}
第三题
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
/*
因为|s| = 1e6 每段长度1e3到1e4,直接暴力如果重复出现100次以上就判为No
*/
int main()
{
string s; cin >> s;
// 记录重复数量
int cnt = 0;
string tar = s.substr(0, 1000);//从下标0开始 ,存1000个数据
for(int i = 0; i + 1000 < s.size(); i ++)
{
if(tar == s.substr(i, 1000)) //如果开头前1000个,在后续可以找到重复
{
cnt ++;
i += 1000; //从下一个1000开始
}
}
if(cnt < 100) cout << "Yes\n";
else cout << "No\n";
}
E
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
void solve()
{
int n, m, x; cin >> n >> m >> x;
vector<vector<int>> f(m + 1, vector<int>(x + 1)), g(f);
vector<string> s(n + 1);
for (int i = 1; i <= n; i++) cin >> s[i], s[i] = " " + s[i];
int res = 0;
// g 对应的其实就是 f[i-1][j][k] f对应 f[i][j][k]
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
for (int k = 0; k <= x; k++)
{
if (s[i][j] == '0') f[j][k] = max(f[j - 1][k], g[j][k]);
else if (s[i][j] == '1') f[j][k] = max(f[j - 1][k], g[j][k]) + 1;
else
{
if (k >= 1) f[j][k] = max(f[j - 1][k - 1] + 1, g[j][k - 1] + 1);
else f[j][k] = max(f[j - 1][k], g[j][k]);
}
if (i == n && j == m) res = max(res, f[j][k]);
}
}
g = f;
}
cout << res << "\n";
}
int main()
{
int T; cin >> T;
while(T --) solve();
}
/*
大模拟,容易出错的地方是判断结果是否超过1e18输出INF
这里不需要用什么快速幂,特判一下如果x = 1结果为1
否则只要x是比2大的数,2的60次方超过1e18,因此遍历不会超过60次
直接暴力判断即可,需要注意暴力乘的时候可能爆longlong,直接用__int128就好了
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define int long long
string big[11][10], sma[11][10];
string dengyu[10], inf[40];
char g[15][2010];
int col = 0;
void init()
{
big[0][0]="........",sma[0][0]="......";
big[0][1]="........",sma[0][1]=".00000";
big[0][2]=".0000000",sma[0][2]=".0...0";
big[0][3]=".0.....0",sma[0][3]=".0...0";
big[0][4]=".0.....0",sma[0][4]=".0...0";
big[0][5]=".0.....0",sma[0][5]=".00000";
big[0][6]=".0.....0",sma[0][6]="......";
big[0][7]=".0.....0",sma[0][7]="......";
big[0][8]=".0000000",sma[0][8]="......";
big[0][9]="........",sma[0][9]="......";
big[1][0]="........",sma[1][0]="......";
big[1][1]="........",sma[1][1]=".....1";
big[1][2]=".......1",sma[1][2]=".....1";
big[1][3]=".......1",sma[1][3]=".....1";
big[1][4]=".......1",sma[1][4]=".....1";
big[1][5]=".......1",sma[1][5]=".....1";
big[1][6]=".......1",sma[1][6]="......";
big[1][7]=".......1",sma[1][7]="......";
big[1][8]=".......1",sma[1][8]="......";
big[1][9]="........",sma[1][9]="......";
big[2][0]="........",sma[2][0]="......";
big[2][1]="........",sma[2][1]=".22222";
big[2][2]=".2222222",sma[2][2]=".....2";
big[2][3]=".......2",sma[2][3]=".22222";
big[2][4]=".......2",sma[2][4]=".2....";
big[2][5]=".2222222",sma[2][5]=".22222";
big[2][6]=".2......",sma[2][6]="......";
big[2][7]=".2......",sma[2][7]="......";
big[2][8]=".2222222",sma[2][8]="......";
big[2][9]="........",sma[2][9]="......";
big[3][0]="........",sma[3][0]="......";
big[3][1]="........",sma[3][1]=".33333";
big[3][2]=".3333333",sma[3][2]=".....3";
big[3][3]=".......3",sma[3][3]=".33333";
big[3][4]=".......3",sma[3][4]=".....3";
big[3][5]=".3333333",sma[3][5]=".33333";
big[3][6]=".......3",sma[3][6]="......";
big[3][7]=".......3",sma[3][7]="......";
big[3][8]=".3333333",sma[3][8]="......";
big[3][9]="........",sma[3][9]="......";
big[4][0]="........",sma[4][0]="......";
big[4][1]="........",sma[4][1]=".4...4";
big[4][2]=".4.....4",sma[4][2]=".4...4";
big[4][3]=".4.....4",sma[4][3]=".44444";
big[4][4]=".4.....4",sma[4][4]=".....4";
big[4][5]=".4444444",sma[4][5]=".....4";
big[4][6]=".......4",sma[4][6]="......";
big[4][7]=".......4",sma[4][7]="......";
big[4][8]=".......4",sma[4][8]="......";
big[4][9]="........",sma[4][9]="......";
big[5][0]="........",sma[5][0]="......";
big[5][1]="........",sma[5][1]=".55555";
big[5][2]=".5555555",sma[5][2]=".5....";
big[5][3]=".5......",sma[5][3]=".55555";
big[5][4]=".5......",sma[5][4]=".....5";
big[5][5]=".5555555",sma[5][5]=".55555";
big[5][6]=".......5",sma[5][6]="......";
big[5][7]=".......5",sma[5][7]="......";
big[5][8]=".5555555",sma[5][8]="......";
big[5][9]="........",sma[5][9]="......";
big[6][0]="........",sma[6][0]="......";
big[6][1]="........",sma[6][1]=".66666";
big[6][2]=".6666666",sma[6][2]=".6....";
big[6][3]=".6......",sma[6][3]=".66666";
big[6][4]=".6......",sma[6][4]=".6...6";
big[6][5]=".6666666",sma[6][5]=".66666";
big[6][6]=".6.....6",sma[6][6]="......";
big[6][7]=".6.....6",sma[6][7]="......";
big[6][8]=".6666666",sma[6][8]="......";
big[6][9]="........",sma[6][9]="......";
big[7][0]="........",sma[7][0]="......";
big[7][1]="........",sma[7][1]=".77777";
big[7][2]=".7777777",sma[7][2]=".....7";
big[7][3]=".......7",sma[7][3]=".....7";
big[7][4]=".......7",sma[7][4]=".....7";
big[7][5]=".......7",sma[7][5]=".....7";
big[7][6]=".......7",sma[7][6]="......";
big[7][7]=".......7",sma[7][7]="......";
big[7][8]=".......7",sma[7][8]="......";
big[7][9]="........",sma[7][9]="......";
big[8][0]="........",sma[8][0]="......";
big[8][1]="........",sma[8][1]=".88888";
big[8][2]=".8888888",sma[8][2]=".8...8";
big[8][3]=".8.....8",sma[8][3]=".88888";
big[8][4]=".8.....8",sma[8][4]=".8...8";
big[8][5]=".8888888",sma[8][5]=".88888";
big[8][6]=".8.....8",sma[8][6]="......";
big[8][7]=".8.....8",sma[8][7]="......";
big[8][8]=".8888888",sma[8][8]="......";
big[8][9]="........",sma[8][9]="......";
big[9][0]="........",sma[9][0]="......";
big[9][1]="........",sma[9][1]=".99999";
big[9][2]=".9999999",sma[9][2]=".9...9";
big[9][3]=".9.....9",sma[9][3]=".99999";
big[9][4]=".9.....9",sma[9][4]=".....9";
big[9][5]=".9999999",sma[9][5]=".99999";
big[9][6]=".......9",sma[9][6]="......";
big[9][7]=".......9",sma[9][7]="......";
big[9][8]=".9999999",sma[9][8]="......";
big[9][9]="........",sma[9][9]="......";
dengyu[0]="........";
dengyu[1]="........";
dengyu[2]="........";
dengyu[3]="........";
dengyu[4]=".=======";
dengyu[5]="........";
dengyu[6]=".=======";
dengyu[7]="........";
dengyu[8]="........";
dengyu[9]="........";
inf[0]="........................";
inf[1]="........................";
inf[2]=".IIIIIII.N.....N.FFFFFFF";
inf[3]="....I....NN....N.F......";
inf[4]="....I....N.N...N.F......";
inf[5]="....I....N..N..N.FFFFFFF";
inf[6]="....I....N...N.N.F......";
inf[7]="....I....N....NN.F......";
inf[8]=".IIIIIII.N.....N.F......";
inf[9]="........................";
}
// 判断是否超过1e18
int check(int x, int y)
{
if(x == 1) return 1;
__int128 res = 1;
for(int i = 1; i <= y; i ++)
{
res *= x;
if(res > 1e18) return 0;
}
return res;
}
// 把数字提取到vector数组中
void tiqu(int x, vector<int>& vec)
{
while(x)
{
vec.push_back(x % 10);
x /= 10;
}
reverse(vec.begin(),vec.end());
}
// 添加大数
void add_big(vector<int>& vec)
{
for(auto x : vec)
{
for(int i = 0; i < 10; i ++)
for(int j = 0; j < 8;j ++)
g[i][col + j] = big[x][i][j];
col += 8;
}
}
// 添加小数
void add_small(vector<int>& vec)
{
for(auto x : vec)
{
for(int i = 0; i < 10; i ++)
for(int j = 0; j < 6;j ++)
g[i][col + j] = sma[x][i][j];
col += 6;
}
}
// 添加等于号
void add_dengyu()
{
for(int i = 0; i < 10; i ++)
for(int j = 0; j < 8;j ++)
g[i][col + j] = dengyu[i][j];
col += 8;
}
// 添加INF
void add_inf()
{
for(int i = 0; i < 10; i ++)
for(int j = 0; j < 24;j ++)
g[i][col + j] = inf[i][j];
col += 24;
}
// 最后一列"."
void add_col()
{
for(int i = 0; i < 10; i ++)
g[i][col] = '.';
col += 1;
}
// 打印结果
void print()
{
for(int i = 0; i < 10; i ++)
{
for(int j = 0; j < col; j ++)
cout << g[i][j];
cout << endl;
}
}
void solve()
{
col = 0;
int x, y;
scanf("%lld^{%lld}", &x, &y);
vector<int> vecx;
tiqu(x, vecx);
add_big(vecx);
vector<int> vecy;
tiqu(y, vecy);
add_small(vecy);
add_dengyu();
int res = check(x, y);
if(res == 0){
add_inf();
}
else{
vector<int> vecres;
tiqu(res, vecres);
add_big(vecres);
}
add_col();
print();
}
signed main()
{
init();
int T; cin >> T;
while(T --) solve();
}
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
void solve()
{
int n, k; cin >> n >> k;
if(n * 2 < k) cout << "0 " << n * 2 << '\n';
else cout << n - (k - 1) / 2 << ' ' << n + k / 2 << '\n';
}
signed main()
{
int T; cin >> T;
while(T --) solve();
}
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
void solve() {
int n; cin >> n;
if (n <= 4) cout << -1 << "\n";
else if (n == 5) cout << "4 1 3 5 2\n";
else if (n == 6) cout << "1 3 5 2 4 6\n";
else if (n == 7) cout << "1 3 5 7 2 4 6\n";
else if (n == 8) cout << "1 3 5 7 2 4 6 8\n";
else if (n == 9) cout << "1 3 5 7 9 2 4 6 8\n";
else if (n == 10) cout << "1 3 10 5 7 9 2 4 6 8\n";
else if (n == 11) cout << "1 3 10 5 2 7 9 11 8 6 4\n";
else
{
vector<int> vec;
if(n & 1) {
for(int i = 1; i <= n; i += 2)
{
vec.push_back(i);
if(i == 5) vec.push_back(2);
if(i == n - 6) vec.push_back(n - 1);
}
for(int i = n - 3; i >= 4; i -= 2)
vec.push_back(i);
}
else {
for(int i = 1; i <= n - 3; i += 2)
{
vec.push_back(i);
if(i == 5) vec.push_back(2);
}
for(int i = n; i >= 4; i -= 2)
{
vec.push_back(i);
if(i == n - 4) vec.push_back(n - 1);
}
}
for(auto x : vec) cout << x << " ";
cout << '\n';
}
}
signed main()
{
int T; T = 1;
while(T --) solve();
}