//统计字符出现次数并以换行作为结束
#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;
}