一、子串分值
题目链接:子串分值 - 蓝桥云课 (lanqiao.cn)
题目要求:
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中恰好出现一次的字符个数。例如f(aba)=1,f(abc)=3,f(aaa)=0。现在给定一个字符串 S0⋯n−1(长度为 n,1≤n≤105),请你计算对于所有 S 的非空子串 Si⋯j(0≤i≤j
解题思路:
一个字符的影响范围由其往左边遍历遇到的第一个相同字符和其往右边遍历遇到的第一个相同字符所决定。其贡献值为r-i*i-l 直接套进去双指针就好了
#include<bits/stdc++.h> using namespace std; int main() { string s; cin >> s; long long len = s.length(); long long sum = 0; int l,r; char ss; for(int i = 0; i < len;i++) { ss = s[i]; for(r = i + 1; r < len;r++) { if(s[r]==ss) { break; } } for(l = i - 1; l >= 0;l--) { if(s[l]==ss) { break; } }4 sum += (r - i) * (i - l); cout<<l<<""; } cout << sum; return 0; }
二、小数第n位
题目链接:小数第n位 - 蓝桥云课 (lanqiao.cn)
题目要求:
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开始的 3 位数。
解题思路:
保留余数加扩大a,防止超时进行循环处理n,三位就是n-1 n n+1 然后就可以进行暴力循环,每次*10,如果到了n-1 就输出a/b;
#include<bits/stdc++.h> using namespace std; long long i,a,b,n; int main() { cin>>a>>b>>n; a%=b; while(n>8) { a*=1e8 n-=8; a%=b; } for(i=0;i<n+2;i++) { a*=10; if(i>=n-1) { cout<<a/b; } a%=b; } return 0; }