- 문제 링크 : boj.kr/1893
- 난이도 : P4
- 태그 : KMP
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
vector<int> getPi(vector<int> &P) {
vector<int> Pi(P.size(),0);
int j = 0;
for(int i = 1; i < P.size(); ++i) {
while(j > 0 && P[i] != P[j])
j = Pi[j-1];
if(P[i] == P[j])
Pi[i] = ++j;
}
return Pi;
}
int KMP(vector<int> &S, vector<int> &P) {
auto Pi = getPi(P);
int cnt = 0, j = 0;
for(int i = 0; i < S.size(); ++i) {
while(j > 0 && S[i] != P[j])
j = Pi[j-1];
if(S[i] == P[j]) {
if(j == P.size() - 1) {
cnt++;
j = Pi[j];
}
else {
j++;
}
}
}
return cnt;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while(T--) {
string a, w, s;
cin >> a >> w >> s;
map<char, int> _m;
int n = a.length();
for(int i = 0; i < n; i++) {
_m[a[i]] = i;
}
vector<int> P(w.size());
for(int i = 0; i < w.size(); i++) {
P[i] = _m[w[i]];
}
vector<int> S(s.size());
for(int i = 0; i < s.size(); i++) {
S[i] = _m[s[i]];
}
vector<int> ans;
for(int i = 0; i < n; i++) {
if(KMP(S, P) == 1) ans.emplace_back(i);
for(auto &u : P) {
u = (u + 1) % n;
}
}
if(ans.size() == 0) {
cout << "no solution\n";
continue;
}
else {
cout << (ans.size() == 1 ? "unique: " : "ambiguous: ");
for(auto u : ans) {
cout << u << " ";
}
cout << "\n";
}
}
return 0;
}
풀이
KMP를 A의 길이만큼 해준다.
728x90
'PS' 카테고리의 다른 글
BOJ 3779 : 주기 (2) | 2024.10.11 |
---|---|
BOJ 3356 : 라디오 전송 (0) | 2024.10.10 |
BOJ 1498 : 주기문 (2) | 2024.10.08 |
BOJ 31830 : 알파벳과 쿼리 (Hard) (0) | 2024.10.07 |
BOJ 23833 : F1ow3rC0n (2) | 2024.10.06 |