统计字符出现次数并以换行作为结束

//统计字符出现次数并以换行作为结束

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main(){
    char t;
    int win=0,lose=0,i=0;
  
while((t=getchar())!='\n'){
	
		if(t=='W')win++;
		else if(t=='L')lose++;
		i++;


	
}
	
	
//	cout<<win<<"  "<<lose<<endl;
		printf("%.2f",(win*1.0)/(win+lose));
}

子串分值

题目描述
对于一个字符串 S SS,我们定义 S SS 的分值 f ( S ) f(S)f(S) 为 S SS 中恰好出现一次的字符个数。

例如 f ( “ a b a ” ) = 1 f(“aba”)=1f(“aba”)=1,f ( “ a b c ” ) = 3 f(“abc”)=3f(“abc”)=3,f ( “ a a a ” ) = 0 f(“aaa”)=0f(“aaa”)=0。

现在给定一个字符串 S [ 0.. n − 1 ] S[0..n−1]S[0..n−1],请你计算对于所有 S SS 的非空子串 S [ i . . j ] S[i..j]S[i..j] ,f ( S [ i . . j ] ) f(S[i..j])f(S[i..j]) 的和是多少。

输入格式
输入一行包含一个由小写字母组成的字符串 S。

输出格式
输出一个整数表示答案。

输入样例
ababc

输出样例
21

 


数据范围
对于 20% 的评测用例,1 ≤ n ≤ 10 1 ≤ n ≤ 101≤n≤10;
对于 40% 的评测用例,1 ≤ n ≤ 100 1 ≤ n ≤ 1001≤n≤100;
对于 50% 的评测用例,1 ≤ n ≤ 1000 1 ≤ n ≤ 10001≤n≤1000;
对于 60% 的评测用例,1 ≤ n ≤ 10000 1 ≤ n ≤ 100001≤n≤10000;
对于所有评测用例,1 ≤ n ≤ 100000 1 ≤ n ≤ 1000001≤n≤100000。
 

 

//仅通过40%,重点熟悉字符串函数的应用
#include<iostream>
using namespace std;
#include<bits/stdc++.h>
int main(){
	string s;
	cin>>s;
	int t=s.size();
	
	int sum=0;
	int max=0;
	string s1,s2;
	for(int i=1;i<=t;i++){//表示当前子串的位数 
		for(int j=0;j+i<=t;j++){//表示当前要比对的字符串的开始 
	
			s1=s.substr(j,i);
		//	cout<<s1<<endl;
			for(int k=0;k<26;k++){
				char m=k+'a';
				int num=count(s1.begin(),s1.end(),m);
			//	cout<<m<<num<<endl;
				if(num==1){
					sum++;
				}
				
			}
	//	cout<<endl;
			
		}
	}
	cout<<sum<<endl;
}
/*string x = s.substr();       //默认时的长度为从开始位置到尾
	string y = s.substr(5);      //获得字符串s中 从第5位开始到尾的字符串
	string z = s.substr(5, 3);    //获得字符串s中 从第5位开始的长度为3的字符串
	
	
	 string s= "abcdefgaabbccd";
    int num =count(s.begin(),s.end(),'a');
	*/

获取字符串的子串

string x = s.substr();       //默认时的长度为从开始位置到尾
    string y = s.substr(5);      //获得字符串s中 从第5位开始到尾的字符串
    string z = s.substr(5, 3);    //获得字符串s中 从第5位开始的长度为3的字符串
    
    //统计字符串中某个字符出现的次数
     string s= "abcdefgaabbccd";
    int num =count(s.begin(),s.end(),'a');

 

 

题解二
乘法原理 O ( N ) O(N)O(N):

解题思路:

统计每个字母在仅出现一次的情况下,能被多少子串所包含;
用 pre[i] 记录第 i 个字母上一次出现的位置,用 next[i] 记录第 i 个字母下一次出现的位置;
那么往左最多能延伸到 pre[i] + 1,其到第 i 个字母一共有 i - pre[i] 个字母;
同理往右最多能延伸到 next[i] - 1,其到第 i 个字母一共有 next[i] - i 个字母;
二者相乘,就是该字母被不同子串所包含的总次数;


#include <iostream>
using namespace std;

typedef long long LL;

const int N = 100010, M = 150;

string s;
int Pre[N], Next[N], Idx[M];

int main()
{
    cin >> s;
    
    int n = s.size();
    s = ' ' + s;
    
    for (int i = 1; i <= n; i ++)
    {
        Pre[i] = Idx[s[i]];
        Idx[s[i]] = i;
    }
    
    for (int i = 97; i <= 122; i ++) Idx[i] = n + 1;		// 右边界初始化
    
    for (int i = n; i >= 1; i --)
    {
        Next[i] = Idx[s[i]];
        Idx[s[i]] = i;
    }
    
    LL ans = 0;
    for (int i = 1; i <= n; i ++)
        ans += (LL) (i - Pre[i]) * (Next[i] - i);

    cout << ans << endl;
    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半截詩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值