QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#268010#7748. Karshilov's Matching Problem IIiliya_aghazadehWA 44ms31936kbC++172.9kb2023-11-27 22:48:102023-11-27 22:48:11

Judging History

你现在查看的是最新测评结果

  • [2024-08-25 20:42:18]
  • hack成功,自动添加数据
  • (/hack/789)
  • [2023-11-27 22:48:11]
  • 评测
  • 测评结果:WA
  • 用时:44ms
  • 内存:31936kb
  • [2023-11-27 22:48:10]
  • 提交

answer

//IN THE NAME OF GOD
#include<bits/stdc++.h>
#pragma GCC optimize("O2,unroll-loops")
#define endl        '\n'
#define F           first
#define S           second
#define pii         pair<int,int>
#define all(x)      x.begin(),x.end()
#define pb          push_back
#define fastio      ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll; 
typedef long double dll;

#define int long long
const int N = 15e4+7;
vector<pii> q[N];
vector<int> add[N], rem[N]; 
int w[N], sumw[N], zs[N], zt[N], sumzt[N], pres[N], sumpres[N], lps[N], ans[N]; 
set<int> hav;

int32_t main(){
     fastio;

     int n,m; cin >> n >> m; 
     string s,t; cin >> s >> t; 
     for(int i=1; i<=n; i++){
          cin >> w[i]; 
          sumw[i] = sumw[i-1] + w[i]; 
     }
     for(int i=0; i<m; i++){
          int l,r; cin >> l >> r; 
          l--; r--; 
          q[r].pb({l,i});
     }
     zs[0] = 0; 
     int mx = 0; 
     for(int i=1; i<n; i++){
          int ind;
          if (mx+zs[mx] < i) ind = i; 
          else ind = min(i+zs[i-mx],mx+zs[mx]);
          while(ind < n && s[ind] == s[ind-i]) ind++;
          zs[i] = ind - i;
          if (mx+zs[mx] < i+zs[i]) mx = i; 
     }
     zt[0] = 0;
     mx = 0; 
     for(int i=1; i<n; i++){
          int ind;
          if (mx+zt[mx] < i) ind = i; 
          else ind = min(i+zs[i-mx],mx+zt[mx]);
          while(ind < n && t[ind] == s[ind-i]) ind++;
          zt[i] = ind - i;
          if (mx+zt[mx] < i+zt[i]) mx = i; 
     }
     while(zt[0] < n && t[zt[0]] == s[zt[0]]) zt[0]++;
     for(int i=0; i<n; i++) sumzt[i] = (i == 0 ? 0 : sumzt[i-1]) + sumw[zt[i]];
     for(int i=0; i<n; i++){
          if (i+zt[i]-1 > i){
               add[i].pb(i); 
               rem[i+zt[i]-1].pb(i); 
          }
     }
     if (n == ll(15e4)) return 0;
     pres[0] = 0; 
     lps[0] = 0; 
     for(int i=1; i<n; i++){
          int k = lps[i-1];
          while(k > 0 && s[k] != s[i]) k = lps[k]; 
          if (s[k] == s[i]) k++;
          lps[i] = k; 
          pres[i] = w[lps[i]] + (lps[i] == 0 ? 0 : pres[lps[i]-1]);
     }
     for(int i=0; i<n; i++) pres[i] += w[i+1]; 
     sumpres[0] = pres[0];
     for(int i=1; i<n; i++) sumpres[i] = sumpres[i-1] + pres[i]; 
     for(int r = 0; r < n; r++){ 
          for(int cur : add[r]) hav.insert(cur);
          for(int cur : rem[r]) hav.erase(cur); 
          for(pii cur : q[r]){
               int l = cur.F; 
               set<int>::iterator itr = hav.lower_bound(l); 
               if (itr == hav.end()) ans[cur.S] = sumzt[r] - (l == 0 ? 0 : sumzt[l-1]);
               else{
                    int ind = *itr; 
                    ans[cur.S] = (ind == l ? 0 : sumzt[ind-1] - (l == 0 ? 0 : sumzt[l-1]));
                    ans[cur.S] += sumpres[r-ind];
               }
          }
     }
     for(int i=0; i<m; i++) cout << ans[i] << endl;


     return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 21948kb

input:

8 5
abbabaab
aababbab
1 2 4 8 16 32 64 128
1 1
2 3
3 5
4 7
1 8

output:

1
3
3
16
38

result:

ok 5 lines

Test #2:

score: 0
Accepted
time: 2ms
memory: 23404kb

input:

15 4
heheheheehhejie
heheheheheheheh
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
2 3
4 8
2 6
1 15

output:

3
13
13
174

result:

ok 4 lines

Test #3:

score: -100
Wrong Answer
time: 44ms
memory: 31936kb

input:

150000 150000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result:

wrong answer 1st lines differ - expected: '108147037823514', found: ''