2 9 10 MLE了??
查看原帖
2 9 10 MLE了??
137469
霍士弘楼主2020/7/31 08:16

交到UOJ就A了

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define maxn 1000000
#define mod 1000000007
#define ll long long
using namespace std;
int t;
ll ans;
char s[maxn + 10];
int len,p,top,nxt[maxn + 10],pos[maxn + 10],dep[maxn + 10],st[maxn + 10];
vector<int> g[maxn + 10];
void getnxt()
{
	nxt[0] = -1;
	for(int i = 1;i <= len;i++)
	{
		int now = nxt[i-1];
		while((now != -1) && (s[now+1] != s[i])) now = nxt[now];
		nxt[i] = now + 1;
		g[nxt[i]].push_back(i);
		dep[i] = dep[nxt[i]] + 1;
	}
}
void dfs(int u)
{
	st[++top] = u;
	while(p + 1 <= top && st[p + 1] <= u / 2) p++;
	ans = ans % mod * (dep[st[p]] + 1) % mod,pos[u] = st[p];
	for(int i = 0;i < g[u].size();i++) dfs(g[u][i]);
	st[top] = 0;
	top--;
	p = pos[nxt[u]];
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s+1);
		len = strlen(s+1);
		memset(g,0,sizeof(g));
		memset(nxt,0,sizeof(nxt));
		memset(pos,0,sizeof(pos));
		memset(dep,0,sizeof(dep));
		memset(st,0,sizeof(st));
		ans = 1;
		getnxt();
		p = 1,top = 0;
		dfs(0);
		printf("%lld\n",ans);
	}
	//cerr<<(sizeof(s) + sizeof(nxt) + sizeof(pos) + sizeof(dep) + sizeof(st) + sizeof(g)) / 1024.0 / 1024.0;
	return 0;
}
2020/7/31 08:16
加载中...