牛客练习赛74AB

博客围绕CCA的数列和字符串问题展开。数列问题需判断给定数列是否为“牛”的,即满足等差数列、等比数列或等模数列条件之一;字符串问题是计算给定字符串中“牛”的子串数量,即含“NowCoder”子串的数量,并给出两种解题思路。

A CCA的数列

题目
链接:https://ac.nowcoder.com/acm/contest/9700/A
来源:牛客网

题目描述
给定一个长度为 n 数列,判断其是否为“牛”的,是则输出“YES”,否则输出“NO”。
一个数列是“牛”的,当且仅当其满足以下三个条件中至少一个:
1、这个数列是等差数列
2、这个数列是等比数列
3、这个数列是等模数列。
等差数列和等比数列的定义如果不清楚建议百度或重上小学(划掉),等模数列的定义是:对于任意相邻两数,后一个对前一个取模后的值均相等。
输入描述:
第一行一个整数 n。
第二行 n 个整数,分别表示这个数列的值。
输出描述:
一行,一个单词“YES”或“NO”(不含引号)。
示例1
输入
复制
5
1 2 3 4 5
输出
复制
YES
说明
此数列为等差数列。
示例2
输入
复制
3
5 7 16
输出
复制
YES
说明
此数列为等模数列。
备注:
3 <= n <= 10^5,1 <= 数列中的每个数<=10^9

题意
符合等比数列等差数列等mod数列就是“牛”的数列 问给定数列是否为牛数列

思路
直接比较即可,很坑的地方是 等比数列必须考虑到公比不是整数的情况,但是也不能用double存因为后面要取模

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 100000+100;

int a[maxn];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int f1 = 1,f2 = 1,f3 = 1;
	int b = a[2] - a[1];
	for(int i=3;i<=n;i++)
	{
		if(a[i]-a[i-1]!=b)
		{
			f1 = 0;
			break;
		}
	}
	if(f1)
	return cout<<"YES",0;
	double c = a[2]*1.0/a[1]*1.0;
//	cout<<c<<endl;
	for(int i=3;i<=n;i++)
	{
		if(1.0*a[i]/a[i-1]*1.0!=c)
		{
//			cout<<i<<" "<<1.0*a[i]/1.0*a[i-1]<<endl;
			f2 = 0;
			break;
		}
	}
	if(f2)
	return cout<<"YES",0;
	int d = a[2]%a[1];
	for(int i=3;i<=n;i++)
	{
		if(a[i]%a[i-1]!=d)
		{
			f3 = 0;
			break;
		}
	}
	if(f3)
	return cout<<"YES",0;
	cout<<"NO";
} 

B CCA的字符串

题目
链接:https://ac.nowcoder.com/acm/contest/9700/B
来源:牛客网

题目描述
给定一个仅由大写字母和小写字母组成的字符串。
一个字符串是“牛”的,当且仅当其有一个子串为“NowCoder”(区分大小写)。
问给定字符串有多少个子串是“牛”的。
输入描述:
一行,一个字符串。
输出描述:
一行,一个数表示答案。
示例1
输入
复制
NowCoderNowCode
输出
复制
8
备注:
字符串长度<=10^5

题意
给定一个字符串 定义“牛”的字符串当且仅当其有一个子串为“NowCoder”

这里非常需要注意的是 当且仅当有一个子串为“NowCoder”的意思是,只要有一个子串是“NowCoder”就可以,两个连着的也行!!!打比赛的时候吃了语文的亏还行,题面也改了三次 从子串改成子序列又改成子串 有点迷惑

思路1
查询当前下一个“NowCoder”的位置,用len - position - 8 + 1 (-8的意思是去掉“NowCoder”这一段,+1代表着算上“NowCoder”自己) 再减去当前的位置,由于i是往后递增的,所以position是递减的,这时候由于前面算过了 所以要减去i

代码1

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    string s;
    cin>>s;
    int len = s.size();
    int cnt = 0;
    long long ans = 0;
    for(int i=0;i<len-7;i++)
    {
//        string now = "";
//        for(int j=i;j<i+8;j++)
//        now += s[j];
        long long cnt = s.substr(i).find("NowCoder");
//        cout<<cnt<<endl;
        if(cnt == -1) break;
            ans += len - 8 + 1 - i - cnt;
//        cout<<ans<<endl;
    }
    cout<<ans;
    return 0;
}

/*
NowCoderNowCoder
*/

思路2

学习牛客网上同仁写的 并加深了理解
考虑代表元计数法,把每个子串的贡献记录在最靠左的 NowCoder 上。

[ i , i + 7 ] [i, i + 7] [i,i+7] 这一段是 NowCoder,lastlast 为上一个 NowCoder 左端点的位置,可取的左端点范围是 [ l a s t + 1 , i ] [last + 1, i] [last+1,i],右端点是 [ i + 7 , n ] [i + 7, n] [i+7,n],对答案的贡献即 ( i − l a s t ) × ( n − ( i + 7 ) + 1 ) (i - last) \times (n - (i + 7) + 1) (ilast)×(n(i+7)+1)

代码2

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
 
int main()
{
    string s;
    cin>>s;
    s = "+" + s;
    ll len = s.size();
    len--;
    ll cnt = 0;
    ll ans = 0;
    ll last = 0;
//    cout<<len<<endl;
    for(int i=1;i<=len-7;i++)
    {
        string now = "";
        for(int j=i;j<i+8;j++)
        now += s[j];
        if(now=="NowCoder")
        {
//        	cout<<i<<endl;
        	ans += (i - last) * (len - (i+7) + 1LL);
        	last = i;
		}
    }
    cout<<ans;
    return 0;
}

/*
NowCoderNowCoder
*/
牛客练习赛142是一场编程竞赛,通常包含多个算法题目,涵盖如数组、字符串、链表、动态规划等常见数据结构与算法知识点。针对这类比赛的解题思路和方法,可以从以下几个方面进行分析: ### 题目类型与解题策略 1. **数组相关问题** - 常见的题目包括查找数组中出现次数超过一半的数字、寻找缺失的数字、求解最大子数组和等。 - 解题方法包括使用哈希表统计频率、摩尔投票法(适用于多数元素问题)、双指针技巧或前缀和优化。 2. **链表操作** - 链表题目可能涉及反转链表、判断链表是否有环、找出两个链表的相交节点等。 - 例如,在找两个链表相交点的问题中,可以先计算各自长度,然后让长链表先走差值步数,再同步遍历比较节点地址[^3]。 3. **字符串处理** - 包括最长回文子串、无重复字符的最长子串等。 - 可采用滑动窗口、动态规划或中心扩展法等策略。 4. **树与图** - 树相关的题目可能涉及二叉树的遍历、路径和、最近公共祖先等问题。 - 图论问题可能需要使用深度优先搜索(DFS)、广度优先搜索(BFS)或拓扑排序等算法。 5. **动态规划** - 动态规划常用于解决背包问题、最长递增子序列、编辑距离等。 - 关键在于定义状态转移方程,并通过迭代或记忆化搜索进行求解。 6. **贪心算法** - 适用于区间调度、活动选择、硬币找零等问题。 - 贪心策略的核心在于每一步都做出局部最优选择。 ### 示例代码:摩尔投票法解决“多数元素”问题 ```python def majorityElement(nums): count = 0 candidate = None for num in nums: if count == 0: candidate = num count += (1 if num == candidate else -1) return candidate ``` 该算法时间复杂度为 O(n),空间复杂度为 O(1),非常适合处理大规模输入的数据集[^2]。 ### 提升解题能力的建议 - **刷题积累经验**:在 LeetCode、Codeforces、AtCoder 等平台上持续练习,熟悉各种题型。 - **学习经典算法**:掌握常见的算法模板,如二分查找、归并排序、快速选择等。 - **阅读官方题解与讨论区**:了解不同解法的优劣,尤其是最优解的时间复杂度分析。 - **模拟比赛训练**:定期参加在线编程比赛,提升实战能力和代码调试速度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值