B. IMissYou!
求和输出就行了,字符串容易看走眼打错,直接复制题目的。
#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;void solve(){int a[8];a[0]=0;per(i,1,7)cin>>a[i],a[0]+=a[i];if(a[0]>0){cout<<"IMissYou!"<<endl<<a[0];}else{cout<<"OvO";}
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}
A. Jargonless
累计方案数很容易想到,对于S中所有存在的T,均取头和尾的位置相乘,就是当前合法T的所有方案。
但是这样会重复计算,比如头去掉0个和尾去掉0个,下一个也会去掉头0个和尾0个。
给出一个显然的结论:
假如第一个合法的T在S中的位置是,L~R,那么下一个合法T的位置,一定从L+1开始,且一定没有R-1。
所以当头移除1~3位置对上4~5的时候
下一个字符串移除1~3位置也一定只能对上4~5的位置,不会有1~3对上3~5,所以前一个位置的L就不需要了,我们只需要累计当前newL~L之间的新长度即可。
那么考虑移动L的左端点,求差值即可去除重复。
#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;void solve(){string s,t;cin>>s>>t;s="0"+s;t="0"+t;// 123// i jint l=0,ans=0;per(i,1,s.length()-1){if(s[i]==t[1]){int now=2;per(j,i+1,s.length()-1){if(s[j]==t[now])now++;if(now==t.length()){ans+=(i-l)*(s.length()-1-j+1);l=i;break;}}}}cout<<ans;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}