首页 > 其他分享 >UVA1223 Editor 题解

UVA1223 Editor 题解

时间:2024-04-07 09:22:42浏览次数:27  
标签:5010 cnt int 题解 num Editor UVA1223 sa id

题目传送门

前置知识

后缀数组简介

解法

一个子串出现至少 \(2\) 次等价于有至少连续 \(2\) 个后缀以这个子串作为公共前缀。

进行一次后缀排序后,有 \(\max\limits_{i=1}^{|s|} \{ height_{i} \}\) 即为所求。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
int sa[5010],rk[10010],oldrk[10010],id[5010],cnt[5010],key[5010],height[5010];
char s[5010];
int val(char x)
{
	return (int)x;
}
void counting_sort(int n,int m)
{
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=n;i++)
	{
		cnt[key[i]]++;
	}
	for(int i=1;i<=m;i++)
	{
		cnt[i]+=cnt[i-1];
	}
	for(int i=n;i>=1;i--)
	{
		sa[cnt[key[i]]]=id[i];
		cnt[key[i]]--;
	}
}
void init_sa(char s[],int len)
{
	int m=127,tot=0,num=0,i,j,w;
	for(i=1;i<=len;i++)
	{
		rk[i]=val(s[i]);
		id[i]=i;
		key[i]=rk[id[i]];
	}
	counting_sort(len,m);
	for(w=1;tot!=len;w<<=1,m=tot)
	{
		num=0;
		for(i=len;i>=len-w+1;i--)
		{
			num++;
			id[num]=i;
		}
		for(i=1;i<=len;i++)
		{
			if(sa[i]>w)
			{
				num++;
				id[num]=sa[i]-w;
			}
		}
		for(i=1;i<=len;i++)
		{
			key[i]=rk[id[i]];
		}
		counting_sort(len,m);
		for(i=1;i<=len;i++)
		{
			oldrk[i]=rk[i];
		}
		tot=0;
		for(i=1;i<=len;i++)
		{
			tot+=(oldrk[sa[i]]!=oldrk[sa[i-1]]||oldrk[sa[i]+w]!=oldrk[sa[i-1]+w]);
			rk[sa[i]]=tot;
		}
	}
	for(i=1,j=0;i<=len;i++)
	{
		j-=(j>=1);
		while(s[i+j]==s[sa[rk[i]-1]+j])
		{
			j++;
		}
		height[rk[i]]=j;
	}
}
int main()
{
	int t,n,ans,i,j;
	cin>>t;
	for(j=1;j<=t;j++)
	{
		ans=0;
		cin>>(s+1);
		n=strlen(s+1);
		init_sa(s,n);
		for(i=1;i<=n;i++)
		{
			ans=max(ans,height[i]);
		}
		cout<<ans<<endl;
	}
	return 0;
}

后记

强化版:luogu P2852 [USACO06DEC] Milk Patterns G

标签:5010,cnt,int,题解,num,Editor,UVA1223,sa,id
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18118390

相关文章

  • SP64 PERMUT1 - Permutations 题解
    题目传送门前置知识动态规划基础解法设\(f_{i,j}\)表示\(1\simi\)的全排列中存在\(j\)个逆序对的方案数,状态转移方程为\(f_{i,j}=\sum\limits_{k=j-\min(i-1,j)}^{j}f_{i-1,k}=\sum\limits_{k=0}^{j}f_{i-1,k}-\sum\limits_{k=0}^{j-\min(i-1,j)-1}f_{i-1,k}\)。需......
  • COCI2011-2012#3 ROBOT 题解
    洛谷题面部分分做法直接依照题意模拟即可。可以获得\(48\)分的好成绩。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;longlongn,m;structnode{ longlongx; longlongy;}point[100005];longlongrobotx=0,roboty=0;longlongquery(){......
  • 不知道什么题的题解
    多组测试数据,问你满足\(lcm\left(x,y\right)=n\)的数对\(\left(x,y\right)\)的数量。由于唯一分解定理,我们不妨令\(x=p_{1}^{a_1}\timesp_{2}^{a_2}\times\cdots\timesp_{i}^{a_i}\),同理,\(y=p_{1}^{b_1}\timesp_{2}^{b_2}\times\cdots\timesp_{i}^......
  • 第33次CSP认证500分题解
    近年来最简单的一次\(CSP\)认证,\(3\)个小时现场满分直接拿下。1、没啥好说的,直接开桶拿下。#include<bits/stdc++.h>usingnamespacestd;#defineN1000010template<classT>inlineTread(T&a){Tx=0,s=1;charc=getchar();while(!isdigi......
  • ABC348F 题解
    一些注意点:一看到这种题就应该往bitset的方向想。如果用bitset,就应该跳脱之前的思维,尝试从最朴素的暴力重新想起。看到这道题,发现直接做非常的不可做的样子,考虑bitset。我们可以先枚举左端点\(l\)。这样,当我们枚举\(j\)时,对于所有的\(k\)使得\(a_{k,j}=a_......
  • 网站使用CDN出现ttf woff等字体跨域问题解决方案
    如果cdn域名+资源路径是可以通过浏览器url地址栏打开的那么一般是因为nginx配置的原因,找到nginx的配置文件添加以下代码:# 允许指定域名访问;location ~ .*.(eot|ttf|ttc|otf|eot|woff|woff2|svg)(.*) { add_header Access-Control-Allow-Origin http(s)://......
  • arch安装教程+部分问题解决
    arch安装教程+部分问题解决网络配置#进入iwctliwctl#获取device名称我这里是wlan0,后面注意wlan0替换成你自己devicedevicelist#扫描附近wifistationwlan0scan#获取所有可连接wifi名字stationwlan0get-networksstationwlan0connect[wifi名]#输入密码......
  • CF1149D Abandoning Roads 题解
    Description一张\(n\)个点\(m\)条边的无向图,只有\(a,b\)两种边权(\(a<b\)),对于每个\(i\),求图中所有的最小生成树中,从\(1\)到\(i\)距离的最小值。\(2\leqn\leq70,n-1\leqm\leq200,1\leqa<b\leq10^7\)。Solution先考虑一个最小生成树是什么样的形态,显然保留边权......
  • P10245 Swimming Pool题解
    P10245SwimmingPool题意给你四条边\(abcd\),求这四条边是否可以组成梯形。思路这显然是一道简单的普通数学题。判断是否能构成梯形只需看四条边是否能满足,上底减下底的绝对值小于两腰之和且大于两腰之差。证明过程如图,\(AB=a\),\(BC=b\),\(CD=c\),\(AD=d\)。过点\(D\)......
  • P10244 String Minimization 题解
    P10244StringMinimization题意给你四个长度为\(n\)的字符串,分别是\(abcd\)。你可以选择一个\(i\)然后交换\(a[i]\)和\(c[i]\),并交换\(b[i]\)和\(d[i]\)。求在\(a\)的字典序尽量小的前提下,\(b\)字典序最小是什么。思路本题并不难。只需要在\(a[i]>c[i]\)......