QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#832914#8475. Palindrome StringscwfxlhWA 7ms56964kbC++142.3kb2024-12-26 11:01:422024-12-26 11:01:42

Judging History

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

  • [2024-12-26 11:01:42]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:56964kb
  • [2024-12-26 11:01:42]
  • 提交

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'