萌新刚学 OI,求助一道大水题
查看原帖
萌新刚学 OI,求助一道大水题
298549
SIXIANG32楼主2023/7/14 16:07

如题,呜呜呜真的不知道自己哪里错了,感觉写的都很对啊没问题啊,但是第三个样例死活过不去,求助/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);
}
2023/7/14 16:07
加载中...