题意:
给出一个字符串,你要把它尽量压缩成一个短的字符串,比如一个字符串ababab
你可以转化成3ab
,长度为 3,比如bbbacacb
转化成3b2ac1b
,长度为 7,aaaaaaaaaa
转化为10a
,长度为 3。
思路:先n^2预处理出i,j之间的需要多少长度变成,然后简单状态转移一下。预处理的时候要运用到next数组的性质,即求一个字符串的最小循环的长度,如果len % (len - next[len]) != 0那么最小长度为len,否则为 len / (len - next[len]).所以预处理的时候枚举每个字符串的起点,然后得到next数组。
PS:本来以为8000 * 8000不行,没想到过了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define clr(x,y) memset(x,y,sizeof x)
#define PI acos(-1.0)
#define ITER set<int>::iterator
const int Mod = 1e9 + 7;
const int maxn = 8000 + 10;
char s[maxn];
int n