QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#832925 | #8475. Palindrome Strings | cwfxlh | WA | 10ms | 59212kb | C++14 | 2.3kb | 2024-12-26 11:05:54 | 2024-12-26 11:05:55 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,q,val[1000003];
ll ans;
string s,t;
struct SAM{
int fa;
int tr[27];
int len;
int num;
int sum;
}sam[2000003];
vector<int>son[2000003];
int totP,lst;
int f[1000003],g[1000003];
void manacher(string x){
int len=x.length();
f[1]=1;
for(int i=2,j=1;i<=len;i++){
if(i<=j+f[j]-1)f[i]=min(f[j*2-i],(j+f[j]-1)-i+1);
else f[i]=1;
while(f[i]+1<=min(i,len-i+1)&&x[(i+(f[i]+1)-1)-1]==x[(i-(f[i]+1)+1)-1])f[i]++;
if(i+f[i]-1>j+f[j]-1)j=i;
}
g[1]=0;
for(int i=2,j=1;i<=len;i++){
if(i<=j+g[j]-1)g[i]=min(g[j*2-1-i],(j+g[j]-1)-i+1);
else g[i]=0;
while(g[i]+1<=min(i-1,len-i+1)&&x[(i+(g[i]+1)-1)-1]==x[(i-(g[i]+1))-1])g[i]++;
if(i+g[i]-1>j+g[j]-1)j=i;
}
return;
}
void add(int l,int r,int v){val[l]+=v;val[r+1]-=v;}
void samadd(int val){
sam[++totP].len=sam[lst].len+1;
int cur=totP;
while(lst&&sam[lst].tr[val]==0){sam[lst].tr[val]=cur;lst=sam[lst].fa;}
if(!lst){lst=cur;sam[cur].fa=1;return;}
if(sam[sam[lst].tr[val]].len==sam[lst].len+1)sam[cur].fa=sam[lst].tr[val];
else{
int q=sam[lst].tr[val];
sam[++totP]=sam[q];
sam[totP].len=sam[lst].len+1;
while(lst&&sam[lst].tr[val]==q){sam[lst].tr[val]=totP;lst=sam[lst].fa;}
sam[q].fa=sam[cur].fa=totP;
}
lst=cur;
return;
}
void dfs(int now){
for(auto i:son[now]){
dfs(i);
sam[now].sum+=sam[i].sum;
sam[now].num+=sam[i].num;
}
return;
}
bool chk(int X){
if(X==0)return true;
if(X%2==0)if(g[(X/2)+1]>=(X/2))return true;
if(X%2==1)if(f[(X/2)+1]>=(X/2)+1)return true;
return false;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>q;
cin>>s;
for(int i=1;n-i+1>i;i++)swap(s[i-1],s[n-i]);
manacher(s);
for(int i=1;i<=n;i++){
add(i-f[i]+1,i,1);
add(i-g[i],i-1,1);
}
for(int i=1;i<=n;i++)val[i]+=val[i-1];
val[n+1]=0;
totP=lst=1;
for(int i=1;i<=n;i++)samadd(s[i-1]-'a'+1);
for(int i=1,j=1;i<=n;i++){
j=sam[j].tr[s[i-1]-'a'+1];
sam[j].num++;
sam[j].sum+=val[i+1];
}
for(int i=2;i<=totP;i++)son[sam[i].fa].emplace_back(i);
dfs(1);
while(q--){
cin>>t;
m=t.length();
for(int i=1;m-i+1>i;i++)swap(t[i-1],t[m-i]);
manacher(t);
ans=0;
int pos=1;
for(int i=m;i;i--){
pos=sam[pos].tr[t[i-1]-'a'+1];
if(chk(i-1)&&pos)ans+=sam[pos].num;
}
if(pos)ans+=sam[pos].sum;
cout<<ans<<'\n';
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 56896kb
input:
8 3 icpccamp p c pc
output:
4 7 4
result:
ok 3 number(s): "4 7 4"
Test #2:
score: 0
Accepted
time: 10ms
memory: 56880kb
input:
10 3 bbbabbbbbb baaaa abb bb
output:
10 4 31
result:
ok 3 number(s): "10 4 31"
Test #3:
score: 0
Accepted
time: 3ms
memory: 56828kb
input:
10 4 baababaaba aaaaa a ab aa
output:
8 18 17 11
result:
ok 4 number(s): "8 18 17 11"
Test #4:
score: -100
Wrong Answer
time: 7ms
memory: 59212kb
input:
10000 1000 aabababbbaaabbbabbbbbbbbbaaabaabbbabbaababbbaaabbaabbbbbabababbbbbbbabbabaabaababbabaaababbbbaaabaababaaaaabbbbbbabbbababaababbbbabbbbabbabbbbbbabbaababbbbbbabaabababbbaabaaabbbbaaaabaaababbaaabbbbabababbaaabababababaababaabbaaabbaabababbbaabbbabaabbbbbbbbaabbaaabbbaabbaabbbabaabababbbbbb...
output:
678 44 413 1015 397 76 6 8 58610 9 284 62106 11855 177714 110716 177714 110716 177714 110716 110716 177714 177714 177714 177714 177714 177714 177714 110716 110716 177714 177714 110716 177714 110716 110716 110716 110716 110716 177714 110716 110716 110716 177714 177714 110716 177714 110716 177714 1107...
result:
wrong answer 1st numbers differ - expected: '300', found: '678'