菜鸡的淘汰赛反思

  昨天差点人没了,还是自己太菜了,以后要加油,要认真学算法, 多刷题(ง •̀_•́)ง

1000 神奇的开关

被这题(自己太菜)搞得心态崩了 浪费了好多时间
题意: 给定长度为n的01序列,每次可以选取任意整数i,将i~n的所有位取反(即0变成1,1变成0),问最少几次操作之后可以得到全0序列。
本题有坑!!!学长给提示了,但我没看见 就是不能用 scanf("%c") QAQ
思路:  在字符串前加个0,然后找与上个字符不一样的字符的数量就行

#include<bits/stdc++.h>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	string s;
	int n;
	cin >> n >> s;
	s = "0" + s;
	int cnt = 0;
	for(int i = 1; i <= n; i ++)
		if(s[i] != s[i - 1]) cnt ++;
	cout << cnt << endl;
	return 0;
}

1001 sq的简单数学公式


公式题,唯一的难点就是求逆元

补充:

1、求逆元
    a、 什么是逆元? 若 \(a * b ≡ 1 (mod p)\) 则 a 为 b 在模p条件下的逆元 这样就可以将模p下的除法,转换成乘法
    b、 求逆元 根据 欧拉定理 \(a^{φ(n)} \equiv 1\) (mod n)   \(\varphi(n)\) 为欧拉函数, 是\(1-n\)中与\(n\)互质的数的个数 则可得 \(a* a^{φ(n) - 1} \equiv 1\) (mod n), a与\(a^{φ(n) - 1}\)互为模n下的逆元。
        本题用的是一种特殊情况, 当\(n\)为质数时(费马小定理),\(φ(n) = n-1\) 此时 \(a^{n-1} \equiv 1\) (mod n) 即 \(a * a ^ {n - 2} \equiv 1\) (mod n) 故a的逆元为\(a^{n - 2}\)
2、快速幂
    在1.a中用一般方法求\(a^{n - 2}\)可能会爆 \(long \: long\) 所以 我们可以将乘方分解成乘法, \(a^b\) = \(\overbrace {a*a*a*a \dots *a}\),  以倍增的方式扩大a

快速幂代码:

typedef long long ll;

ll ksm(ll a, ll b, ll p)
{
	ll res = 1;
	while(b)
	{
		if(b & 1) res = res * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return res;
}

1004 白嫖怪Long Long

题意: 给你两个字符串a, b 判断b是否为回文串, 若是, 则输出b在a中的位置
直接用kmp即可

#include<bits/stdc++.h>

#define fi first
#define se second

using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
vector<PII> res;
const int N = 1000010;

int nxt[N];
char a[N], b[N];

bool check()
{
	int len = strlen(b + 1);
	for(int i = 1, j = len; i < j; i ++, j --)
		if(b[i] != b[j]) return false;
		
	return true;
}

void getNxt()
{
	int len = strlen(b + 1);
	for(int i = 2, j = 0; i <= len; i ++)
	{
		while(j && b[i] != b[j + 1]) j = nxt[j];
		
		if(b[i] == b[j + 1]) j ++;
		
		nxt[i] = j;
	}
}

void kmp()
{
	getNxt();
	int n = strlen(a + 1);
	int m = strlen(b + 1);
	for(int i = 1, j = 0; i <= n; i ++)
	{
		while(j && a[i] != b[j + 1]) j = nxt[j];
		
		if(a[i] == b[j + 1]) j ++;
		
		if(j == m)
		{
			j = nxt[j];
			res.push_back({i - m + 1, i});
		}
	}
}

int main()
{
	int t;
	cin >> t;
	while(t --)
	{
		scanf("%s", a + 1);
		scanf("%s", b + 1);
		if(check())
		{
			puts("YES");
			
			kmp();
			
			printf("%d\n", res.size());
			
			for(auto t : res)
				printf("%d %d\n", t.fi, t.se);
			res.clear();
		} 
		else  puts("NO");
		if(t) puts("");
	}
	return 0;
}
posted @ 2020-12-14 17:11  合计飞  阅读(39)  评论(0编辑  收藏  举报