結果
| 問題 | No.3638 Itsuki |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-25 15:11:40 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 94 ms / 3,000 ms |
| + 262µs | |
| コード長 | 2,765 bytes |
| 記録 | |
| コンパイル時間 | 2,355 ms |
| コンパイル使用メモリ | 336,072 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2026-08-25 15:11:55 |
| 合計ジャッジ時間 | 4,349 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 2 |
| 小課題1 | 10 % | AC * 5 |
| 小課題2 | 50 % | AC * 6 |
| 小課題3 | 40 % | AC * 18 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
#include <cassert>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll,ll>;
using vb = vector<bool>;
using vi = vector<int>;
using vll = vector<long long>;
using vvi = vector<vi>;
using vvll = vector<vll>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vs = vector<string>;
using vc = vector<char>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define all(a) (a).begin(), (a).end()
#define uniq(v) sort(all(v)), (v).erase(unique(all(v)),(v).end())
#define lb(v,x) int(lower_bound(all(v),(x))-(v).begin())
#define ub(v,x) int(upper_bound(all(v),(x))-(v).begin())
#define rrep(i,n) for(int i = (int)(n) - 1; i>=0; i--)
#define rep1(i,n) for(int i=1; i <=(int)(n);i++)
#define reps(i,s,n) for(int i=(int)(s);i<(int)(n); i++)
#define koz " "
#define tor "\n"
template<class T> using min_pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> bool chmin(T& a, const T& b){if(b<a){a=b;return true;}return false;}
template<class T> bool chmax(T& a, const T& b){if(a<b){a=b;return true;}return false;}
template<typename T, typename U> T ceil(T x, U y){
assert(y!=0);
if(y<0) x=-x,y=-y;
return (x>0 ? (x+y-1)/y : x/y);
}
template<typename T, typename U> T floor(T x, U y){
assert(y!=0);
if(y<0) x=-x,y=-y;
return (x>0 ? x/y : (x-y+1)/y);
}
template<typename T> int popcnt(T x){return __builtin_popcountll(x);}
const int dx[]={1,0,-1,0,1,1,-1,-1};
const int dy[]={0,1,0,-1,1,-1,1,-1};
const int INF = 1045141919;
const ll LINF = 3643648101145141919;
// Z[i] = S[i..] と S[0..] の最長共通接頭辞長。全体 O(n)
vi z_algorithm(const string &s){
int n = s.size();
vi z(n);
z[0] = n;
int l = 0, r = 0;
for(int i = 1; i < n; i++){
if(i < r) z[i] = min(r - i, z[i - l]);
while(i + z[i] < n && s[z[i]] == s[i + z[i]]) z[i]++;
if(i + z[i] > r){ l = i; r = i + z[i]; }
}
return z;
}
void solve(){
int n,q;
cin >> n >>q;
string s;
cin >> s;
while(q--){
int t;
cin >> t;
if(t==1){
int idx;
char c;
cin >> idx >> c;
idx--;
s[idx]=c;
}
else{
string t;
cin >> t;
string al=t+'0'+s;
vi z=z_algorithm(al);
int sz=t.size();
int up=al.size();
bool ok=false;
reps(i,sz+1,up){
if(z[i]==sz) ok=true;
}
if(ok) cout << "Yes" << tor;
else cout << "No" << tor;
}
}
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(16);
int _ = 1;
//cin >> _;
while(_--) solve();
}