记录编号 296583 评测结果 AAAAAAAAAA
题目名称 1709.[SPOJ 705] 不同的子串 最终得分 100
用户昵称 sxysxy 是否通过 通过
代码语言 C++ 运行时间 0.014 s
提交时间 2016-08-15 18:46:38 内存使用 10.97 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
int cnt = 0;
const int MAXN = 5e4+20;
class SAM
{
	int size, last;
	public:
	struct state
	{
		int len, link;
		int next[26];
		void init()
		{
			len = 0;
			link = -1;
			memset(next, 0, sizeof(next));
		}
	}st[MAXN<<1];
	SAM()
	{
		last = size = 0;
		newst();
	}
	int newst()
	{
		st[size++].init();
		return size-1;
	}
	void expand(int c)
	{
		int cur = newst();
		st[cur].len = st[last].len + 1;
		int p;
		for(p = last; p != -1 && !st[p].next[c]; p = st[p].link)
			st[p].next[c] = cur;
		if(p == -1)
		{
			st[cur].link = 0;
		}else
		{
			int q = st[p].next[c];
			if(st[q].len == st[p].len + 1)
				st[cur].link = q;
			else
			{
				int clone = newst();
				st[clone].len = st[p].len + 1;
				st[clone].link = st[q].link;
				memcpy(st[clone].next, st[q].next, 26*sizeof(int));
				for(; p != -1 && st[p].next[c] == q; p = st[p].link)
					st[p].next[c] = clone;
				st[cur].link = st[q].link = clone;
			}
		}
		cnt += st[cur].len - st[st[cur].link].len;
		last = cur;
	}
};
SAM s;
int main()
{
	freopen("subst1.in", "r", stdin);
	freopen("subst1.out", "w", stdout);
	char c;
	while(c = getchar())
		if(c >= 'A' && c <= 'Z')
			break;
    s.expand(c - 'A');
	while(c = getchar())
	{
		if(c >= 'A' && c <= 'Z')
			s.expand(c - 'A');
		else
		{
			printf("%d\n", cnt);
			break;
		}
	}
	return 0;
}