首页 > 其他分享 >牛客小白月赛83

牛客小白月赛83

时间:2023-12-16 19:55:56浏览次数:29  
标签:字符 int res ll -- 牛客 小白月赛 83 mod

  • 总结&&吐槽:
    这场B wa了13发,笑死人了,真的会有这么菜的人么,读错题目了。下次读b这种题的时候要更加细心一点。

  • D.小天的子序列

    1. 题目大意:给定一个字符串全部由小写字母组成,然后又若干次查询,问有多少个以字符x开头以字符y结尾,并且长度为k。
    2. 思路分析:发现只要找到了x和y,那么只要长度大于等于k,那么就只要组合一下就能出答案。所以问题就回到了:怎么样去维护字符串?我们想要知道的东西无非就是两个,一是有多少个x开头y结尾的长度大于等于k的子串。然后思考一下就会发现可以去维护一个:以x字符开头,以y字符结尾,并且长度为len的子串有多少个。发现维护这个东西要O(n^2)的复杂度,由于给定字符串长度很小,所以直接维护就行。
    3. 注意事项:写模板的时候注意要开ll。。。
    4. 代码:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
ll inv[501],fact[501];
ll res[26][26][501];
ll qpow(ll a,ll b) {
    ll res = 1;
    while(b) {
        if(b&1) res = res*a%mod;
        a = a*a%mod;
        b >>= 1;
    }
    return res;
}
ll C(int n,int m) {
    if(m > n) return 0;
    return (fact[n]*inv[m]%mod*inv[n - m]%mod);
}
void init() {
    inv[0] = 1,fact[0] = 1;
    for(int i = 1; i <= 500; i++) 
        fact[i] = fact[i - 1]*i%mod;
    inv[500] = qpow(fact[500],mod - 2);
    for(int i = 499; i >= 1; i--) 
        inv[i] = inv[i + 1]*(i + 1)%mod;
}
int main() {
    init();
    //cout << C(5,2) << "\n";
    int n;cin >> n;
    string s;cin >> s;
    s = " " + s;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j < i; j++) {
            res[s[j] - 'a'][s[i] - 'a'][i - j + 1]++;
        }
    }
    int q;
    cin >> q;
    while(q--) {
        char x,y;
        int len;
        cin >> x >> y;
        cin >> len;
        ll ans = 0;
        for(int i = len; i <= n; i++) {
            ans += (res[x - 'a'][y - 'a'][i]%mod*C(i - 2,len - 2))%mod;
        }
        cout << ans%mod << "\n";
    }
    return 0;
}
* E.小天的贪吃蛇
  1. 题目大意:给定两种贪吃蛇的运动轨迹,贪吃蛇在一个充满字符的举证中运动。然后给定若干查询,要回答贪吃蛇最多能吃掉多少字符。询问用3种,一种是修改,另外两种分别对应两种运动轨迹并且给定起点。每次输出最多能吃掉多少字符。
  2. 思路分析:因为轨迹是固定的,所以可以直接把二维平面变成一维的线段。然后用set记录每个字母出现的位置。其实求最多的并不是一个求最值问题,而是找到给定起点之后第一个不是该字符的其他字符。由于总共只有26个字母,所以二分一下就可以知道距离当前起点最近的字符是哪个,做差就可以。如果当前字符后面没有别的字符,那么代表当前点到最后点都是可以吃掉的。
  3. 代码:
点击查看代码
#include<bits/stdc++.h>                      
using namespace std;
const int N = 1e5 + 7;
typedef long long ll;
typedef pair<int,int> PII;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
int n,m;
vector<char> a[N];
int calcr(int x,int y) {
	int res = 0;
	if(x%2 == 0) res += (x - 1)*m + (m - y + 1);
	else res = (x - 1)*m + y;
	//cout << res << "\n";
	return res;
}
int calcc(int x,int y) {
	int res = 0;
	if(y&1) res += (y - 1)*n + x;
	else res += (y - 1)*n + (n - x + 1);
	return res;
}
void solve() {
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			char c;
			cin >> c;
			a[i].push_back(c);
		}
	}
	set<int> pos1[1000],pos2[1000];
	bool flag = 1;
	int cnt = 1;
	for(int i = 1; i <= n; i++) {
		if(!flag) {
			for(int j = m - 1; j >= 0; j--) {
				pos1[a[i][j] - 'a'].insert(cnt++);
			}
			flag = 1;
		} else {
			for(int j = 0; j < m; j++) {
				pos1[a[i][j] - 'a'].insert(cnt++);
			}
			flag = 0;
		}
	}
	flag = 1,cnt = 1;
	for(int j = 0; j < m; j++) {
		if(flag) {
			for(int i = 1; i <= n; i++) {
				pos2[a[i][j] - 'a'].insert(cnt++);
			}
			flag = 0;
		} else {
			for(int i = n; i >= 1; i--) {
				pos2[a[i][j] - 'a'].insert(cnt++);
			}
			flag = 1;
		}
	}
	/*for(int i = 0; i <= 25; i++) {
		if(!pos1[i].empty()) {
			cout << "i = " << i << "\n";
			for(auto j : pos1[i])
				cout << j << " ";
			cout << endl;
		}
	}*/
	int q;
	cin >> q;
	while(q--) {
		int op;
		cin >> op;
		if(op == 1) {
			int x,y;
			cin >> x >> y;
			char c;cin >> c;
			auto t1 = calcr(x,y),t2 = calcc(x,y);
			//cout << t1 << " " << t2 << "\n";
			char d = a[x][y - 1];
			pos1[d - 'a'].erase(t1),pos1[c - 'a'].insert(t1);
			pos2[d - 'a'].erase(t2),pos2[c - 'a'].insert(t2);
			a[x][y - 1] = c;
		} else if(op == 2) {
			int x,y;
			cin >> x >> y;
			char d = a[x][y - 1];
			int t1 = calcr(x,y);
			//cout << t1 << "\n";
			int minn = 1e8;
			for(int i = 0; i <= 25; i++) {
				if(i == (d - 'a')) continue;
				if(pos1[i].lower_bound(t1) != pos1[i].end()) {
					auto pos = *pos1[i].lower_bound(t1);
					minn = min(minn,pos);
				}
			}
			if(minn == 1e8) cout << n*m - t1 + 1 << "\n";
			else cout << minn - t1 << "\n";
		} else {
			int x,y;
			cin >> x >> y;
			char d = a[x][y - 1];
			int t1 = calcc(x,y);
			int minn = 1e8;
			for(int i = 0; i <= 25; i++) {
				if(i == (d - 'a')) continue;
				if(pos2[i].lower_bound(t1) != pos2[i].end()) {
					auto pos = *pos2[i].lower_bound(t1);
					minn = min(minn,pos);
				}
			}
			if(minn == 1e8) cout << n*m - t1 + 1 << "\n";
			else cout << minn - t1 << "\n";
		}
	}
}
 int main() {
	int t = 1;
	//cin >> t;
	while(t--) {
		solve();
	}
	return 0;
}

标签:字符,int,res,ll,--,牛客,小白月赛,83,mod
From: https://www.cnblogs.com/Jerry114514/p/17905177.html

相关文章

  • CodeForces 838D Airplane Arrangements
    洛谷传送门CF传送门考虑加入第\(n+1\)个位置,这样座位构成了一个环。每个位置被覆盖的概率相等,为\(\frac{m}{n+1}\),然后算出概率再乘方案数就行了。code//Problem:D.AirplaneArrangements//Contest:Codeforces-IndiaHacks2ndElimination2017(unofficial,......
  • 2023 牛客多校 9 B
    给定\(1\lea<m\le10^9\),求\(1\leu\le10^{18}\)使得\(a^u\equivu\pmodm\)。做法先考虑不限制解的大小怎么做。显然有如果\(a^v\equivv\pmod{\varphi(m)}\),且\(v\ge\varphi(m)\),则\(a^{a^v}\equiva^v\pmodm\),于是取\(u=a^v+m\varphi(m)......
  • NRF52832---SYSTEM_ON&SYSTEM_OFF
    Nordic的低功耗有两种模式:SystemOff和SystemOnSYSTEM_ONSystemon状态有持续延迟和低功率子模式。当系统空闲进入SystemOn模式时,默认情况下将处于低功耗子模式,通常最低功耗为1.9uA(nRF52832)或1.5uA(nRF52840),包括LFCLK和RTC。这是连接事件之间的正常状态。CPU在计......
  • NRF52832---串口通信
    我在做一个蓝牙demo,蓝牙主控用的nrf52832。在添加DFU功能后,使用“nRFConnect”app连接上demo后,点击“notify”,蓝牙就会断开连接,log打印如下图 没有提示出错的行号。我是用的蓝牙传输方式是透传。我查遍了关于nrf52832内存不足的帖子,都没有解决。我去问了技术售后(我买的开发......
  • 牛客Java题目练习
    Java用监视器机制实现了线程之间的同步执行。byteb=(byte)129的值是-127,因为byte的存储数字范围为[-128,127],在计算机中,数值用补码表示,相当于一个环,因此是-127。一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。错误,因为忽略......
  • [CF839E] Mother of Dragons
    最优方案一定是选择一个团,并在团里平均分配点权。实际上,定义一个点\(u\)的权重\(w_u\)为\(\sum\limits_{(u,v)}s_v\),那么如果方案中\(w_x>w_y\),将\(y\)去掉并将其点权加在\(x\)上一定更优,所以答案一定会被调整成一个团。对于求最大团,只需要meetinthemiddle加上......
  • selenium运行时的ValueError: Timeout value connect was <object object at 0x000001
    fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("https://www.baidu.com/")运行时出现ValueError:Timeoutvalueconnectwas<objectobjectat0x000001FE483C4170>错误大概率原因是:selenium和urllib3库的版本冲突导致修改版本为:selenium=3.1......
  • 牛客挑战赛71 B树上博弈
    Link一道很有意思的min-max博弈用树上dp来解决,那么显然的,当前节点是谁取的会影响答案,\(dp2_{i,j}\)表示取当前阶段,被Alice/Bob取走的结果,并且这个题是取子树上任意的节点,那么还需要保存子树上的信息,故使用\(dp_{i,j}\)记录下子树中的Alice/Bob取走的结果,然后就可以顺着dp解决这......
  • 实验六 周天意 202383290417
    实验六实验内容1.实验任务1验证性实验。输入代码,结合运行结果,观察、理解以下用法:结构体类型的定义结构体数组的输入、输出、元素访问结构体数组作为函数参数结构体类型作为函数返回值类型问题场景描述:学生成绩包括:学号、姓名、课程名称、平时成绩、期中成绩、期末成绩、总评成......
  • CF1838C No Prime Differences 题解
    题意:思路:构造:$n$行$m$列,先填奇数行,每行填$m$个,第$2i-1$行依次填入$(i-1)\cdotm+1$,$(i-1)\cdotm+2$,$...$,$i\cdotm-1$,$i\cdotm$,剩下的依次填入偶数行即可。证明:构造完成后,对于每行,相邻两项的差值均为$1$,一定不为......