如题,呜呜呜真的不知道自己哪里错了,感觉写的都很对啊没问题啊,但是第三个样例死活过不去,求助/kel
//SIXIANG
#include <bits/stdc++.h>
#define MAXN 100000
#define int long long
#define QWQ cout << "QWQ" << endl;
using namespace std;
int a[MAXN + 10], b[310][310], tmp[310][310], aa[310];
int f[MAXN + 10][256 + 10];
string str[MAXN + 10];
const int Mod = 998244353;
map <string, int> M;
int qmul(int n, int m) {
int res = 0;
while(m) {
if(m & 1) res = (res + n) % Mod;
n = (n + n) % Mod, m >>= 1;
}
return res;
}
int Addw(int x, int a) {
x <<= 1;
if(a == 1) x |= 1;
x &= 31;
return x;
}
string get(int S) {
string str = "";
for(int p = 4; p >= 0; p--)
if((S >> p) & 1)
str += 'a';
else str += 'b';
return str;
}
bool Find(string str) {
for(int p = 0; p < str.size(); p++) {
string rest = "";
for(int i = p; i < str.size(); i++) {
rest += str[i];
if(M[rest]) return 1;
}
}
return 0;
}
void prepare() {
for(int S = 0; S < (1 << 5); S++) {
if(!Find(get(Addw(S, 0))))
b[Addw(S, 0)][S] = 1;
if(!Find(get(Addw(S, 1))))
b[Addw(S, 1)][S] = 1;
}
for(int S = 0; S < (1 << 6); S++)
a[S & 31] += f[6][S] % Mod;
}
void mulself() {
for(int k = 0; k <= 32; k++)
for(int i = 0; i <= 32; i++) tmp[k][i] = 0;
for(int k = 0; k <= 32; k++)
for(int i = 0; i <= 32; i++)
for(int j = 0; j <= 32; j++)
tmp[i][j] = (tmp[i][j] + qmul(b[i][k], b[k][j]) % Mod) % Mod;
for(int i = 0; i <= 32; i++)
for(int j = 0; j <= 32; j++)
b[i][j] = tmp[i][j];
}
void mul() {
for(int i = 0; i <= 32; i++) aa[i] = 0;
for(int i = 0; i <= 32; i++)
for(int j = 0; j <= 32; j++)
aa[i] = (aa[i] + qmul(b[i][j], a[j]) % Mod) % Mod;
for(int i = 0; i <= 32; i++)
a[i] = aa[i];
}
void qpow(int n) {
while(n) {
if(n & 1) mul();
mulself(); n >>= 1;
}
int ans = 0;
for(int S = 0; S < (1 << 5); S++)
ans = (ans + a[S]) % Mod;
cout << ans << endl;
}
signed main() {
int n, m;
cin >> n >> m;
for(int p = 1; p <= m; p++) {
cin >> str[p];
M[str[p]] = 1;
}
int minn = min(n, 6ll);
if(minn < 6) {
for(int S = 0; S < (1 << minn); S++) {
string rest = "";
for(int i = minn - 1; i >= 0; i--)
if((S >> i) & 1) rest += 'a';
else rest += 'b';
int add = 1;
for(int l = 0; l < rest.size(); l++) {
string tmp = "";
if(!add) break;
for(int r = l; r < rest.size(); r++) {
tmp += rest[r];
if(M[tmp]) {
add = 0;
break;
}
}
}
f[minn][S] = add;
}
int cnt = 0;
for(int p = 0; p < (1 << minn); p++)
cnt += f[n][p];
cout << cnt << endl;
return 0;
}
else {
for(int S = 0; S < (1 << 6); S++) {
string rest = "";
for(int i = minn - 1; i >= 0; i--)
if((S >> i) & 1) rest += 'a';
else rest += 'b';
int add = 1;
for(int l = 0; l < rest.size(); l++) {
string tmp = "";
if(!add) break;
for(int r = l; r < rest.size(); r++) {
tmp += rest[r];
if(M[tmp]) {
add = 0;
break;
}
}
}
f[6][S] += add;
}
}
prepare();
qpow(n - minn);
}