社区讨论

AC代码求证明

P2375[NOI2014] 动物园参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo8vsb7m
此快照首次捕获于
2023/10/28 01:22
2 年前
此快照最后确认于
2023/10/28 01:22
2 年前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
int T;
int nxt[N];
int f[N];
char a[N];

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> T;
	while (T -- ) {
		string st;
		cin >> st;
		int n = st.size ();
		for (int i = 1; i <= n; i ++ ) a[i] = st[i - 1];
		for (int i = 2, j = 0; i <= n; i ++ ) {
			while (j > 0 && a[j + 1] != a[i]) j = nxt[j];
			if (a[j + 1] == a[i]) j ++ ;
			nxt[i] = j;
		}
		long long ans = 1;
		for (int i = 2; i <= n; i ++ ) {
			int p = nxt[i], len = 0, s = 1;
			while (p) {
				if (p <= i / 2) s ++ ;
				p = nxt[p];
				if (f[p]) {
					s += f[p];
					break;
				}
			}
			f[i] = s % mod;
			ans = ans * (s) % mod;
		}
		cout << ans << endl;
	}	
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...