okk,这里时一道hash模板题的延伸
首先思路是什么呢
我们需要从第一位字符
一直比较到最后一位字符
如果中间碰到与其哈希值不对等的一位数字,那么就不是由这个字符复制而来的字符串,因此我们需要继续以两位两位的字符去对比,看是否重复,并依次类推。
假设我们此时有一个由七位字符组成的字符串:
dfsfdss
!!!那我们需要比到第几位呢?是不是只需要比到第四位就可以,因为一旦超出三位之后,再复制,所得的字符串便大于七位了。
那么用代码实现就会是这样的:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int M = 1e7;
ULL power[M], sum[M];
char s1[M];
int main() {
int b = 3;
while (1) {
scanf("%s", s1 + 1);
if (s1[1] == '.')
break;
power[0] = 1;
for (int i = 1; i <= 10000000; i++)
power[i] = power[i - 1] * b;
sum[0] = 0;
int m = strlen(s1 + 1), tmp = 1, ans = 0;
for (int i = 1; i <= m; i++)
sum[i] = sum[i - 1] * b + (ULL)(s1[i] - 'a' + 1); //,cout<<sum[i]<<" ";
for (int i = 1; i <= m/2+1; i++) {
for (int j = 1; j <= m/i-1; j++) {//此处m/i-1是因为当i为3时,仅需要与后面对比一次便能得出结果,因此要总位数除以匹配位数再减去1
if(m%i!=0){break;
}//此处为了比较主位数是否能够由匹配位数复制而来
if (sum[i] == sum[i * j + i] - sum[i * j]*power[i])//i*j+i为下次需要比较的位数
tmp++;
//cout<<tmp<<" ";
if (sum[i] != sum[i * j + i] - sum[i * j]*power[i]){tmp=1;
break;
}
}//cout<<tmp<<" ";
ans = max(ans, tmp);//比较记录
tmp = 1;//赋值重开
}
cout << ans << endl;
}
return 0;
}
虽然此代码能够实现样例等等但是但是但是!!!
会tle
005ms啊啊啊啊啊啊啊!!!!!