社区讨论

我好慌啊

P7114[NOIP2020] 字符串匹配参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@locuk7yf
此快照首次捕获于
2023/10/30 19:59
2 年前
此快照最后确认于
2023/11/05 06:34
2 年前
查看原帖
oitiku 只有 12pts
luogu 上 64
为什么会 WA 啊
CPP
//I am hunting for the golden stag.
#include <cstring>
#include <cstdio>
typedef long long ll;
const int maxn = 2e6 + 10;
const int base = 131;
const int mod = 1e9 + 7;
int t,pre[maxn],suf[maxn],sum[maxn][27],cnt[27],power[maxn] = { 1 };
ll ash[maxn];
char str[maxn];
inline ll sub(int l,int r) {
	return (ash[r]-ash[l-1]*power[r-l+1]%mod+mod)%mod;
}
int main() {
	for (int i = 1;i < maxn;i++) power[i] = 1ll*power[i-1]*base%mod;
	for (scanf("%d",&t);t--;) {
		scanf("%s",str+1);
		int n = strlen(str+1);
		for (int i = 1;i <= n;i++) {
			ash[i] = suf[i] = pre[i] = 0;
			for (int j = 0;j <= 26;j++) sum[i][j] = 0;
		}
		memset(cnt,0,sizeof cnt);
		for (int i = 1;i <= n;i++) {
			cnt[str[i]-'a']++;
			pre[i] = pre[i-1];
			if (!(cnt[str[i]-'a']&1)) pre[i]--;
			else pre[i]++;
		}
		memset(cnt,0,sizeof cnt);
		for (int i = n;i >= 1;i--) {
			cnt[str[i]-'a']++;
			suf[i] = suf[i+1];
			if (!(cnt[str[i]-'a']&1)) suf[i]--;
			else suf[i]++;
		}
		for (int i = 1;i <= n;i++)
			for (int j = 0;j <= 26;j++) {
				sum[i][j] = sum[i-1][j];
				if (pre[i] <= j) sum[i][j]++;
			}
		for (int i = 1;i <= n;i++) ash[i] = (ash[i-1]*base+str[i])%mod;
		ll ans = 0;
		for (int i = 2;i <= n;i++)
			for (int now = 1;now+i <= n;now += i) {
				if (sub(now,now+i-1) ^ ash[i]) break;
				//for (int j = 1;j < i;j++) if (pre[j] <= suf[now+i]) ans++;
				ans += sum[i-1][suf[now+i]];
			}
		printf("%lld\n",ans);
	}
	return 0;
}

回复

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

正在加载回复...