<1>小红的01串(一)
#include<stdio.h> #include<string.h> char ch[100]; int main() { scanf("%s",ch); int count=0; int len=strlen(ch); for(int i=0;i<len-1;i++) { if(ch[i]!=ch[i+1]) { count++; } } printf("%d",count); }
思路
直接遍历一遍,求 ch[i]!=ch[i+1]的个数即可。
<2>小红的01串(二)
#include<stdio.h> #include<string.h> #define int long long char c[200010]; signed main() { int ans = 0; int cnt = 0; scanf("%s",c); int len = strlen(c); for (int i = 0; i < len - 1; i++) { if (c[i] != c[i + 1]) cnt++; else { ans += (cnt + 1) * cnt / 2; cnt = 0; } } ans += (cnt + 1) * cnt / 2; printf("%lld",ans); } void solve(){ string s; cin>>s; i64 ans=0; for(int i=0;i<s.size();i++){ int r=i; while(r+1<s.size()&&s[r+1]!=s[r]) r++; if(r>i)ans=ans+1LL*(r-i)*(1+r-i)/2; i=r; } cout<<ans<<'\n'; }
思路
如果一个子串满足题意,那么它的所有子串都会满足题意
所以对于每个 i,找到最右边的 j(j>i) 使得该串满足题意,
对于这段区间的答案就是 (j−i)∗(1+j−i)/2
然后找到后把 i跳到 j的位置,继续找即可。