QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#463857 | #5166. 回文匹配 | Iratis | 0 | 0ms | 0kb | C++14 | 4.3kb | 2024-07-05 15:09:12 | 2024-07-05 15:09:12 |
answer
#include<bits/stdc++.h>
using namespace std;
#define md(a) a=(a%mod+mod)%mod
#define file(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
bool ST;
const int N=1000005,B=710,P1=131,mod1=998244353;
int pw1[N*2];
int Test,n,Q,Ans[N],qx[N],qy[N];char str[N],s[N*2];vector<int>inc[N],qry[N];
bool vst[N];int all,t,st[N],top,lim[N*2];vector<int>req[N];
const int M=19491001;
struct Hash_Table
{
int h[M],st[M],top,tot,val[N*2],f[N*2],nxt[N*2];
inline void ins(int v)
{
int x=v%M;
for(int k=h[x];k;k=nxt[k])if(val[k]==v){f[k]++;return ;}
tot++;if(!h[x])st[++top]=x;f[tot]=1,val[tot]=v,nxt[tot]=h[x],h[x]=tot;
}
inline int ask(int v)
{
int x=v%M;
for(int k=h[x];k;k=nxt[k])if(val[k]==v)return f[k];
return 0;
}
inline void Clear()
{
while(top)h[st[top]]=0,top--;tot=0;
}
}Map;
int il1[N],dl1[N],ir1[N],dr1[N*2],ha1[N];
inline void ad1(int&x,int y){x+=y;if(x>=mod1)x-=mod1;}
inline void de1(int&x,int y){x-=y;if(x<0)x+=mod1;}
int scc=0;
struct num
{
int m,len,h1n;vector<int>f;
inline void read(int id)
{
cin>>(str+1);m=strlen(str+1);s[0]=' ';
for(int i=1;i<m;i++)s[++len]=str[i],s[++len]='#';s[++len]=str[m];f.resize(len+1);
for(int i=1,p=0,mid=0;i<=len;i++)
{
if(i<=p)f[i]=min(p-i+1,f[mid*2-i]);
while(i-f[i]>=1&&i+f[i]<=len&&s[i-f[i]]==s[i+f[i]])f[i]++;
if(i+f[i]-1>p)p=i+f[i]-1,mid=i;
}
if(m<B)inc[m].push_back(id);
// for(int i=1;i<=len;i++)cout<<f[i]<<' ';cout<<'\n';
}
inline void gethash()
{
h1n=0;
for(int i=1;i<=len;i++)
{
int a=f[i];if(a>=lim[i])a=5e5+1;
// cout<<a<<'\n';
h1n=(1ll*h1n*P1+a)%mod1;
}
}
inline void up(int l,int r,int st,int v)
{
if(l>r||r<1)return ;if(l<1)st+=(1-l)*2,l=1;
// cout<<"up:"<<l<<' '<<r<<' '<<st<<' '<<v<<'\n';
ad1(il1[l],1ll*pw1[st]*v%mod1),ad1(dl1[r],1ll*pw1[st+(r-l)*2]*v%mod1);
}
// inline void dn(int l,int r,int st,int v)
// {
// if(l>r||l>m)return ;if(r>m)st+=(r-m)*2,r=m;
// cout<<"dn:"<<l<<' '<<r<<' '<<st<<' '<<v<<'\n';
// ad1(ir1[r],1ll*pw1[st]*v%mod1),ad1(dr1[l],1ll*pw1[st+(r-l)*2]*v%mod1);
// }
inline void Run()
{
int l1=0,r1=0,l2=0,r2=0;
l1=0,r1=(t-1)/2,l2=r1+1,r2=t-1;
// cout<<l1<<' '<<r1<<' '<<l2<<" "<<r2<<'\n';
for(int i=1;i<=len;i+=2)
{
int x=(i+1)/2,d=(f[i]-1)/2,p=0;if(!f[i])d=-1;
p=min(d,r1-l1);up(x+l1,x+p,l1*2,5e5+1),up(x+p+1,x+r1,(p+1)*2,f[i]);
p=min(d,r2-l2);up(x+r2-p,x+r2,(r2-p)*2,5e5+1),up(x+l2,x+r2-p-1,l2*2,f[i]);
// dn(x+r2-p,x+r2,0,5e5+1),dn(x+l2,x+r2-p-1,(p+1)*2,f[i]);
}
l1=0,r1=t/2-1,l2=r1+1,r2=t-2;
// cout<<l1<<' '<<r1<<' '<<l2<<" "<<r2<<'\n';
for(int i=2;i<=len;i+=2)
{
int x=i/2+1,d=f[i]/2-1,p=0;
// cout<<x<<" "<<p<<'\n';
p=min(d,r1-l1);up(x+l1,x+p,l1*2+1,5e5+1),up(x+p+1,x+r1,(p+1)*2+1,f[i]);
p=min(d,r2-l2);up(x+r2-p,x+r2,(r2-p)*2+1,5e5+1),up(x+l2,x+r2-p-1,l2*2+1,f[i]);
}
for(int i=1,h1=0;i<=m;i++)
{
h1=1ll*h1*pw1[2]%mod1;
ad1(h1,il1[i]);
ad1(ha1[i],h1);
de1(h1,dl1[i]);
}
for(int i=1;i<=m;i++)if(i>=t)
{
Map.ins(ha1[i]);
}
for(int i=1;i<=m;i++)il1[i]=dl1[i]=ha1[i]=0;
}
}a[N];
inline void Run(int id)
{
a[id].Run();
for(int qid:req[id]){int x=qx[qid];Ans[qid]=Map.ask(a[x].h1n);}
Map.Clear(),req[id].clear();
}
inline void calc()
{
for(int id:inc[t])for(int qid:qry[id])
{
int y=qy[qid];req[y].push_back(qid);
if(!vst[y])st[++top]=y,vst[y]=1;
}all=t*2-1;if(!top)return ;
for(int i=1;i<=all;i++)lim[i]=min(i,all-i+1);for(int id:inc[t])a[id].gethash();
while(top)Run(st[top]),vst[st[top]]=0,top--;
}
inline void calc2(int id)
{
t=a[id].m;
for(int qid:qry[id])
{
int y=qy[qid];req[y].push_back(qid);
if(!vst[y])st[++top]=y,vst[y]=1;
}all=t*2-1;if(!top)return ;
for(int i=1;i<=all;i++)lim[i]=min(i,all-i+1);a[id].gethash();
while(top)Run(st[top]),vst[st[top]]=0,top--;
}
bool ED;
signed main()
{
cerr<<(&ST-&ED)/1024.0/1024<<endl;ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
file(match7);
pw1[0]=1;for(int i=1;i<N*2;i++)pw1[i]=1ll*pw1[i-1]*P1%mod1;
cin>>Test>>n>>Q;for(int i=1;i<=n;i++)a[i].read(i);
for(int i=1;i<=Q;i++){int x,y;cin>>x>>y;qx[i]=x,qy[i]=y;
if(a[x].m<=a[y].m)qry[x].push_back(i);}
for(int i=1;i<B;i++)t=i,calc();for(int i=1;i<=n;i++){if(a[i].m>=B)calc2(i);}
for(int i=1;i<=Q;i++)cout<<Ans[i]<<'\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Dangerous Syscalls
Test #1:
score: 0
Dangerous Syscalls
input:
0 2 500000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
result:
Subtask #2:
score: 0
Dangerous Syscalls
Test #10:
score: 0
Dangerous Syscalls
input:
0 500000 500000 v s o w f c z u d b z h b e w p n l e i e h g h o q u x n k t z i f e t q b s h o q k n k t d x t u p w l h g j c q n i s o v s u e n c j f u w q g u p v w z w p r d n m v d z n j l o n v y u j x j v a e x r l s x g u a h u c b z k b t g h o g k t l u i c q p v c s s s l i c h t o s ...
output:
result:
Subtask #3:
score: 0
Dangerous Syscalls
Test #32:
score: 0
Dangerous Syscalls
input:
0 1 1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
result:
Subtask #4:
score: 0
Skipped
Dependency #1:
0%
Subtask #5:
score: 0
Skipped
Dependency #4:
0%