QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#832914 | #8475. Palindrome Strings | cwfxlh | WA | 7ms | 56964kb | C++14 | 2.3kb | 2024-12-26 11:01:42 | 2024-12-26 11:01:42 |
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]>=(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;
}
詳細信息
Test #1:
score: 100
Accepted
time: 3ms
memory: 56848kb
input:
8 3 icpccamp p c pc
output:
4 7 4
result:
ok 3 number(s): "4 7 4"
Test #2:
score: -100
Wrong Answer
time: 7ms
memory: 56964kb
input:
10 3 bbbabbbbbb baaaa abb bb
output:
1 3 31
result:
wrong answer 1st numbers differ - expected: '10', found: '1'