CSP S T2 求助
  • 板块灌水区
  • 楼主bengshakala1
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/26 13:45
  • 上次更新2023/10/26 15:27:52
查看原帖
CSP S T2 求助
736062
bengshakala1楼主2023/10/26 13:45

n^2代码如下(当前数据85pts)

#include<iostream>
#include<fstream>
using namespace std;

long ans=0;
long nx[26];
long mn[2000005];
long ml[2000005];

void init(long n,string data)
{
	for(long i=0;i<26;i++)
        nx[i]=-1;
}

void cnt(long n)
{
	for(long i=0;i<n;i++)
		ans+=mn[i];
	return;
}

long getnxt(string data,long l,long r,const char e)
{
//    cout<<r+2<<' '<<e<<' '<<l<<endl;
    for(long i=r;i>=l;i--)
    {
        if(data[i]==e && r-i==ml[r]-ml[i])
            return i;
    }
    return -1;
}

// 01234657
// abbabaab
//     l r*
// 00110012
// 00240028

void solve(long n,string data)
{
    
//    cout<<'0'<<' ';
    if(data[0]==data[1])
        mn[1]=1,ml[1]=2;
//    cout<<mn[1]<<' ';
    for(long i=2;i<n;i++)
    {
        if(data[i]==data[i-1])
        {
            if(i==1)
            {
                mn[i]=1;
                ml[i]=2;
            }
            else
            {
                mn[i]=mn[i-2]+1;
                ml[i]=ml[i-2]+2;
            }
        }
        else
        {
            long nxt=getnxt(data,(i-ml[i-1]-1)>=0?(i-ml[i-1]-1):0,i-1,data[i]);
            if(nxt==-1)
                ;
            else if(nxt==0)
            {
                mn[i]=1;
                ml[i]=i+1;
            }
            else
            {
                mn[i]=mn[nxt-1]+1;
                ml[i]=i-nxt+1+ml[nxt-1];
            }
        }
//        cout<<mn[i]<<' ';
    }
//    cout<<endl;
}

int main()
{
	long n;	//under 1900
	string data;
	cin>>n;
	cin>>data;

/*    for(long i=0;i<n;i++)
        cout<<i+1<<' ';
        cout<<endl;
        for(long i=0;i<n;i++)
        cout<<data[i]<<' ';
        cout<<endl;*/

	init(n,data);
	solve(n,data);
	cnt(n);

	cout<<ans<<endl;
	return 0;
}
2023/10/26 13:45
加载中...