比如说,在字符串 abcudg 中你可以找到一个 bug,它分别由字符串的第 2、4、6 个字符组成;再比如字符串 gducba,虽然它包含了 bug 这三个字符,但顺序不对,所以没有找到 bug。值得注意的是,每个字母只能用一次,也就是说,在字符串 bbuugg 中,只可以找到 2 个 bug,而不是 8 个。要输入一个仅包含小写字母的字符串,而且保证这个串的长度小于等于2e5,最后输出这个串里有多少个bug
话说我当年也是在学会使用“有限状态自动机”之后,才觉得自己的编程功力大增的。
#include <iostream>
#include <string>
using namespace std;
const int maxn = 200000;
int B[maxn], U[maxn], G[maxn];
int main(){
string arr;
cin >> arr;
int b = 0, u = 0, g = 0;
for(int i = 0; i < arr.length(); i++){
if(arr[i] == 'b'){
B[b++] = i;
}
else if(arr[i] == 'u'){
U[u++] = i;
}
else if(arr[i] == 'g'){
G[g++] = i;
}
}
int i1 = 0, i2 = 0, i3 = 0, ans = 0;
while(i1 < b && i2 < u && i3 < g ){
while(B[i1] > U[i2] && i2 < u){ //如果不匹配就一直执行循环
i2++;
}
if(i2 >= u){
break;
}
while(U[i2] > G[i3] && i3 < g){ //如果不匹配就一直执行循环
i3++;
}
if(i3 >= g){
break;
}
ans++;
i1++;
i2++;
i3++;
//不能重复使用字母
}
cout << ans << endl;
return 0;
}
话说我当年又过了10年后,是在“自创填表式编码风格”之后,才又觉得自己的编程功力巨增的。
https://bbs.csdn.net/topics/380157851
void aaaa(string s){
long long i=0;
long long j=0;
long long k=0;
for(long long x=0;x<s.length();x++){
if(s[x]=='b'){
a[i]=x;
i++;
}else if(s[x]=='u'){
b[j]=x;
j++;
}else if(s[x]=='g'){
c[k]=x;
k++;
}
}
long long y=k>(i>j?i:j)?k:(i>j?i:j);
long long sum=0;
for(i=0,j=0,k=0;i<y&&j<y&&k<y;){
if(a[i]<b[j]&&a[i]<c[k]&&b[j]<c[k]){
//cout<<a[i]<<"\t"<<b[j]<<"\t"<<c[k]<<endl;
sum++;
i++;
j++;
k++;
}else if(c[k]>a[i]&&c[k]>b[j]&&a[i]>b[j]){
j++;
}else if(b[j]>c[k]&&b[j]>a[i]&&c[k]>a[i]){
k++;
}else if(b[j]>a[i]&&b[j]>c[k]&&a[i]>c[k]){
k++;
}else if(a[i]>b[j]&&a[i]>c[k]&&b[j]>c[k]){
j++;
k++;
}else if(a[i]>c[k]&&a[i]>b[j]&&c[k]>b[j]){
j++;
k++;
}
}
cout<<sum<<endl;
}
#include <stdio.h>
char ln[200000+1],c;
int s,n,i;
int main() {
fgets(ln,200000+1,stdin);
s=0;
n=0;
i=0;
while (1) {
c=ln[i];
if (c=='\n' || c==0) break;
switch (s) {
case 0: if (c=='b') {ln[i]='.';s=1; } break;
case 1: if (c=='u') {ln[i]='.';s=2; } break;
case 2: if (c=='g') {ln[i]='.';s=0;i=-1;n++;} break;
}
i++;
}
printf("%d",n);
return 0;
}