题目链接:https://atcoder.jp/contests/abc138/tasks/abc138_e
思路:先预处理每个字符的下次出现位置,再进行模拟即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int f[30][maxn];
bool v[maxn];
int main() {
string s , t;
ios::sync_with_stdio(0);
cin >> s >> t;
int cnt = 0;
for(int j = 0 ; j < 26 ; j++) {
cnt = 0;
for(int i = s.length() - 1 ; i >= 0 ; i--) {
f[j][i] = cnt;
if(s[i] - 'a' == j) {
cnt = i;
if(!v[j])v[j] = 1;
}
}
}
cnt = 0;
bool flag = 0;
for(int i = 0 ; i < t.length() ; i++)if(!v[t[i] - 'a']) {
flag = 1;
break;
}
if(!flag) {
while(s[cnt] != t[0])
cnt = f[t[0] - 'a'][cnt];
long long ans = 0;
if(t.length() == 1)ans += cnt + 1;
for(int i = 1 ; i < t.length() ; i++) {
int tmp = cnt;
cnt = f[t[i] - 'a'][cnt];
while(s[cnt] != t[i])
cnt = f[t[i] - 'a'][cnt];
if(cnt <= tmp)ans += s.length();
if(i == t.length() - 1)ans += cnt + 1;
}
cout << ans << "\n";
}
else cout << -1 << "\n";
return 0;
}