前几天比赛时候的题目,我们队并没有发现这是一道简单的KMP,值得反省,明天就开学了,我已经是大二的啦,不能这么菜了,转到软件希望acm和绩点都兼顾到吧,尽我所能吧。
题意
题目很长,大体意思是给出一个序列, 前k项是无序的后面都是以p为周期的周期串。求k+p的最小值,若k+p相同则取p最小的值。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000000 + 10;
int n;
int v[maxn];
int nxt[maxn];
void makeNEXT() {
int j=nxt[0]=-1;
int i = 0;
while(i<n) {
if(j==-1||v[i]==v[j])
{
nxt[++i]=++j;
}
else j = nxt[j];
}
}
int main()
{
// freopen("input.txt", "r", stdin);
while(~scanf("%d", &n)) {
for(int i=n-1;i>=0;i--) {
scanf("%d", &v[i]);
}
makeNEXT();
int k=1e9, p=1e9;
for(int i=0;i<n;i++) {
int nk=i;
int np=n-i-nxt[n-i];
if(nk+np<k+p) {
k = nk;
p = np;
}
else if(nk+np==k+p) {
if(np < p) {
k = nk;
p = np;
}
}
}
cout << k << " " << p << endl;
}
return 0;
}