Gardon - DYGG's contest 4,这题相当恶心,首先你要求出最长出现的连续技的长度,而且是不能重叠的,然后如果有两个连续技的长度是一样的话还要输出那个出现的次数多的那个,很恶心。。很恶心。。
第一次敲后缀树。。。。呼~~~~~~
也许标准的做法是后缀数组吧~~不过我不会
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<cassert>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1000001;
const int maxc = 1011;
const int head = 0;
int a[maxc];
int maxlen,sd,ans;
struct zz
{
int to[20];
int len;
int id;
int re;
int have;
}zx[maxn];
int use,n;
int get()
{
use++;
memset(zx[use].to,-1,sizeof(zx[use].to));
zx[use].len = 0;
zx[use].id = 0;
zx[use].re = -inf;
zx[use].have = 0;
return use;
}
void insert(int p)
{
int now = head;
int to;
int c;
for(int i=p;i<=n;i++)
{
c = a[i];
if(zx[now].to[c] != -1)
{
to = zx[now].to[c];
zx[to].len = zx[now].len+1;
now = to;
}
else
{
zx[now].to[c] = get();
to = zx[now].to[c];
zx[to].id = p;
zx[to].len = zx[now].len + 1;
now = to;
}
}
return ;
}
void find(int p)
{
int now = head;
int len = 0;
int c;
for(int i=p;i<=n;i++)
{
c = a[i];
now = zx[now].to[c];
if(zx[now].id > p + len)
{
len++;
if(len > maxlen)
{
maxlen = len;
}
}
else
{
return ;
}
}
return ;
}
void fk(int p)
{
int now = head;
int len = 0;
int c;
int temp;
for(int i=p;i<=n;i++)
{
c = a[i];
now = zx[now].to[c];
if(zx[now].id > p + len)
{
len++;
if(len == maxlen)
{
temp = zx[now].re + maxlen;
if(p >= temp)
{
zx[now].have++;
zx[now].re = p;
ans = max(ans,zx[now].have);
}
else
{
return ;
}
}
}
else
{
return ;
}
}
return ;
}
void start()
{
maxlen = -1;
ans = 0;
for(int i=n;i>=1;i--)
{
insert(i);
}
for(int i=1;i<=n;i++)
{
find(i);
}
if(maxlen == -1)
{
cout<<maxlen<<endl;
return ;
}
for(int i=1;i<=n;i++)
{
fk(i);
}
cout<<maxlen<<" "<<ans+1<<endl;
return ;
}
int main()
{
while(cin>>n)
{
use = -1;
get();
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]++;
}
start();
}
return 0;
}
分享到:
相关推荐
WOJ1204代码的详细解析,这里使用的方法是排序之后找中位数
网上代码
武汉大学 在线oj网站acm.whu.edu.cn starter部分的题解, 计算机学院 考研复试机试练习答案
woj部分水题的代码,不一定写的很好。 可以作以下参考
woj1012题Alternate sum:交替求和
woj试题 1193、1201、1203、1204、1213、1293
从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000、且它们的末尾三位数相等,则称M和N是一对?K尾相等数?。请编写程序,输出M+N值最小的K尾相等数。
用栈来解决。设置两个数组,其中一个是要求输入的数组a。另一个数组b用于保存含有相同的元素的序列。 先把数组的第一个值压入栈底,在看第二个数是不是和第一个数是相同的。如果相同则进栈,否则的话栈底元素出栈...
woj-land 这是一个分支,其创建者和维护者是 。目标计划对woj-land进行增强。 最近计划: 支持解释型语言(首先是 Python2、Python3 和 Ruby) 支持要求的其他语言(例如 Scala、Clojure 和 Brainf**k) 分布式判断...
训练时发现的好题目。#include #include int main() { char ch; char str[100]; while(gets(str)) { if(str[0] == 'E') return 0; int z = 0, o = 0, j = 0, i = 0; while(str[i] !...}
Woj3XSta.github.io:您现在的位置是:首页>流行音乐>流行音乐>流行音乐>我的名字是swyiezawierająsięwszystkie projekty i
平时做的woj上面的某些题目的做法,希望有所帮助
以下是《危险车轮》(WoJ)游戏的规则说明。 游戏设备:在WoJ游戏的用户界面中,将有一个转轮和一个问题板。 这些类似于电视节目中的滚轮和游戏板 游戏规则:玩家轮流转动方向盘并回答问题。 轮到您时,您将旋转...
thousoondth:千鸟格分形 这一切都归结为 execute.js 中的两个方法调用: superTile (0, [ 0, 0 ], true) :在原点(左上角)以 0 分辨率(将... 要执行相反的操作并仅关闭锯齿,您需要向 magicTriangle 添加一个“woJ
以下是《危险车轮》(WoJ)游戏的规则说明。 游戏规则 玩家轮流转动方向盘并回答问题。 轮到您时,您将旋转车轮,并按照车轮扇形上的指示进行操作。 滚轮具有以下12个扇区,随机分布: 危险中的六个类别中的每个...
Cmentarz Podrzecze Cmentarz Podrzecze计划向nieoficjalnej strony项目的cmentarzaznajdującegosięw miejscowocici Podrzecze(woj。małopolskie) Strona pozwala: wyświetlićmapę(plan)cmentarza ...