#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e6;
char ss[N],tt[N];
map<char,char>mp;
struct Hash//双Hash
{
int p, MOD, pp[N];
int pre[N], suf[N];
Hash(int P, int mod)
{
p = P; MOD = mod;
}
void init(char *s, char *t, int n)
{
pp[0] = 1; suf[n + 1] = 0;
for (int i = 1; i <= n; i++)
{
pp[i] = pp[i - 1] * p % MOD;
pre[i] = (pre[i - 1] * p + s[i]) % MOD;
//s的前缀哈希
}
for (int i = n; i >= 1; i--)
{
suf[i] = (suf[i + 1] * p + t[i]) % MOD;
//t的后缀哈希
}
}
//s的子串哈希
int hss(int l, int r)
{
return (pre[r] - pre[l - 1] * pp[r - l + 1] % MOD + MOD) % MOD;
}
//t的子串哈希
int hst(int l, int r)
{
return (suf[l] - suf[r + 1] * pp[r - l + 1] % MOD + MOD) % MOD;
}
bool equal(int l1, int r1, int l2, int r2)
{
return hss(l1, r1) == hst(l2, r2);
}
}hs1(233, 998244353), hs2(1331, 1000000007);
signed main()
{
int T=1,n;
scanf("%lld",&T);
mp['b'] = 'q'; mp['q'] = 'b';
mp['d'] = 'p'; mp['p'] = 'd';
mp['n'] = 'u'; mp['u'] = 'n';
mp['o'] = 'o'; mp['s'] = 's';
mp['x'] = 'x'; mp['z'] = 'z';
while(T--)
{
scanf("%s",ss+1);
n=strlen(ss+1);
for(int i=1;i<=n;i++)
{
tt[i]=mp[ss[i]];
}
hs1.init(ss,tt,n),hs2.init(ss,tt,n);
int l=1;
for(int r=1;r<=n;r++)
{
int mid=(l+r)/2;
if((r-l+1)&1)
{
if(mp[ss[mid]]!=ss[mid])continue;
if(hs1.equal(l,mid-1,mid+1,r)&&hs2.equal(l,mid-1,mid+1,r))
{
l=r+1;
}
}
else
{
if(hs1.equal(l,mid,mid+1,r)&&hs2.equal(l,mid,mid+1,r))
{
l=r+1;
}
}
}
if(l==n+1)puts("Yes");
else puts("No");
}
return 0;
}
一维Hash
typedef unsigned long long int ull;
const int N=1e5+10;
const int M=233;
ull h[N],base[N];
ull query(int l,int r)//获取字符串[l,r]的哈希值
{
return h[r]-h[l-1]*base[r-l+1];
}
void init(string s)//初始化哈希
{
int n=s.size();
s="0"+s;//让其下标从1开始
base[0]=1;
for(int i=1;i<=n;i++)
{
h[i]=h[i-1]*M+s[i];
base[i]=base[i-1]*M;// base[i]=M^i
}
}
ull merge(int l1, int r1, int l2, int r2)
//求[l1,r1],[l2,r2]子串并的哈希值
{
return query(l1, r1) * base[r2 - l2 + 1] + query(l2, r2);
}
二维Hash
typedef long long int ll;
const int N=1010;
ll h[N][N],base1[N],base2[N];
int a[N][N],n,m;
void init()//构建
{
base1[0]=base2[0]=1;
for(int i=1;i<N;i++)
{
base1[i]=base1[i-1]*131;
base2[i]=base2[i-1]*233;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
h[i][j]=h[i][j-1]*131+a[i][j];//行哈希
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
h[i][j]=h[i-1][j]*233+h[i][j];//列哈希
}
ll query(int x1,int y1,int x2,int y2)//查询矩阵的哈希值
{
return h[x2][y2]-h[x2][y1-1]*base1[y2-y1+1]-h[x1-1][y2]*base2[x2-x1+1]
+h[x1-1][y1-1]*base1[y2-y1+1]*base2[x2-x1 + 1];
}