您的位置:首页 > 其它

51Nod-1277 字符串中的最大值

2018-01-16 16:58 288 查看


思路:求出next数组,倒着推一边,把所有前缀出现的次数求出来。然后注意往前传值的时候注意一个小优化,否则会TLE。
#include <cstdio>
#include <cstring>
#define max(a,b) ((a)>(b)?(a):(b))
typedef long long ll;
const int maxn = (int)1e5 + 10;
char s[maxn];
int next[maxn];
void getNext(char p[]) {
int m = strlen(p + 1);
next[1] = 0;
for(int k = 0 , i = 2 ; i <= m ; i++) {
while(k > 0 && p[k + 1] != p [i] ) k = next[k];
if(p[k + 1] == p[i]) k++;
next[i] = k;
}
}
int dp[maxn];
int len;
int main(void) {
scanf("%s", s + 1);
getNext(s);
len = strlen(s + 1);
for(int i = len ; i >= 1 ; i--) {
dp[i]++;
/* int temp = next[i];
while(temp) {
dp[temp]++;
temp = next[temp];
} */
dp[next[i]] += dp[i];
}
ll ans = 0;
for(ll i = 1 ; i <= len ; i++) {
ans = max(i * dp[i] , ans);
}
printf("%lld\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: