专栏文章

题解:P13291 [GCJ 2013 #1C] Consonants

P13291题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miofln79
此快照首次捕获于
2025/12/02 18:24
3 个月前
此快照最后确认于
2025/12/02 18:24
3 个月前
查看原文

P13291 题解:

主要思路:

定义数组存储到当前字符的辅音字母子串的长度,再循环遍历数组,如果当前长度 n\ge n,就加上当前的 in+1i-n+1,用变量存储这个值,否则就加上变量的值,最后输出结果。
解释:为什么要加 in+1i-n+1
我们不难想到,如果出现了一个长度为 nn 的辅音字母子串,那么这个子串加上前面一个字母构成的新子串也一定满足其中包含一个长度为 nn 的辅音字母子串,所以这个问题就转化成了求出当前辅音字母子串前面字母的数量,最后在加上这个子串本身。不难看出,这个值就是子串的左端点,子串的右端点为当前循环遍历到的 ii,那左端点就是 ii 减去子串长度 nn 再加上子串本身的数量 11,即 in+1i-n+1

代码实现:

  • 定义数组 dpdp 存储到当前字符的辅音字母子串的长度,再定义一个判断辅音字母的函数,如果当前字母为辅音字母,就让 dpi=dpi1+1dp_i=dp_{i-1}+1,否则 dpi=0dp_i=0
  • 数组处理完后,定义变量 cnt1cnt1cnt2cnt2,初始化为 00,循环遍历数组,如果当前的 dpi>=ndp_i>=n,就更新 cnt2=in+1cnt2=i-n+1,再让 cnt1cnt1 加上 cnt2cnt2。遍历完以后,此时的 cnt1cnt1 存储的就是结果,输出答案即可。(注意输出格式)
AC Code
CPP
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
char f[6]={' ','a','e','i','o','u'};
inline bool fun(char a){
	for(int i=1;i<=5;i++){
		if(a==f[i]){
			return false;
		}
	}
	return true;
}
constexpr int N=1e7; 
int T; 
int dp[N];
int32_t main(){
	cin.tie(nullptr)->ios::sync_with_stdio(false);
	cout.tie(nullptr)->ios::sync_with_stdio(false);
	cin>>T;
	for(int res=1;res<=T;res++){
		string s;cin>>s;
		int n;cin>>n;
		for(int i=0;i<N;i++){
			dp[i]=0;
		}
		int cnt1=0,cnt2=0;
		for(int i=1;i<=s.size();i++){
			if(fun(s[i-1])){
				dp[i]=dp[i-1]+1;
			}
		}
		for(int i=n;i<=s.size();i++){
			if(dp[i]>=n){
				cnt2=i-n+1;
			}
			cnt1+=cnt2;
		}
		cout<<"Case #"<<res<<": "<<cnt1<<endl;
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...