• 菜鸡的淘汰赛反思


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

    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
    ", res.size());
    			
    			for(auto t : res)
    				printf("%d %d
    ", t.fi, t.se);
    			res.clear();
    		} 
    		else  puts("NO");
    		if(t) puts("");
    	}
    	return 0;
    }
    
  • 相关阅读:
    函数执行的预解释
    数组的基本知识点
    前端开发概述+JS基础细节知识点
    JS数据类型的转换规则
    call,apply,求最大最小值,平均数等基础编程知识
    JS面向对象程序设计(OOP:Object Oriented Programming)
    C++ 手记
    C++ 在堆中申请内存方法
    vc驿站视频教程笔记4 Cstring 讲解
    vc驿站视频教程笔记2 ansi 和 unicode
  • 原文地址:https://www.cnblogs.com/woyaoAC/p/14134288.html
Copyright © 2020-2023  润新知