捞帖&求证明奇怪做法
查看原帖
捞帖&求证明奇怪做法
378346
expnoi楼主2022/6/16 23:04

rt,历史残留问题

同学们瞎写发现了这个可以ac:

https://www.luogu.com.cn/discuss/439544

但是似乎没有在题解区有合理的解释。

有大佬能给个证明吗?

#include<bits/stdc++.h>
using namespace std;
int T,nxt[1000001],f[1000001];
char a[1000001];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--)
	{
		memset(nxt,0,sizeof(nxt));
		memset(f,0,sizeof(f));
		cin>>a+1;
		int n=strlen(a+1);
		int j=0;
		long long res=1;
		for(int i=2;i<=n;i++)
		{
			while(j&&a[i]!=a[j+1])j=nxt[j];
			if(a[i]==a[j+1])j++;
			nxt[i]=j;
		}
		for(int i=1;i<=n;i++)
		{
			int c=nxt[i],ans=0;
			while(c)
			{
				if(2*c<=i)ans++;
				c=nxt[c];
				if(f[c])
				{
					ans+=f[c];
					break;
				}
			}
			f[i]=ans+1;
			res*=(ans+1);
			res%=1000000007;
		}
		cout<<res<<"\n";
	}
}
2022/6/16 23:04
加载中...