QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#832925#8475. Palindrome StringscwfxlhWA 10ms59212kbC++142.3kb2024-12-26 11:05:542024-12-26 11:05:55

Judging History

This is the latest submission verdict.

  • [2024-12-26 11:05:55]
  • Judged
  • Verdict: WA
  • Time: 10ms
  • Memory: 59212kb
  • [2024-12-26 11:05:54]
  • Submitted

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'