-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path937e.cpp
More file actions
125 lines (101 loc) · 2.72 KB
/
937e.cpp
File metadata and controls
125 lines (101 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9;
const int p1 = 137, mod1 = 127657753, p2 = 277, mod2 = 987654319;
int power(long long n, long long k, int mod) {
int ans = 1 % mod; n %= mod; if (n < 0) n += mod;
while (k) {
if (k & 1) ans = (long long) ans * n % mod;
n = (long long) n * n % mod;
k >>= 1;
}
return ans;
}
int ip1, ip2;
pair<int, int> pw[N], ipw[N];
void prec() {
pw[0] = {1, 1};
for (int i = 1; i < N; i++) {
pw[i].first = 1LL * pw[i - 1].first * p1 % mod1;
pw[i].second = 1LL * pw[i - 1].second * p2 % mod2;
}
ip1 = power(p1, mod1 - 2, mod1);
ip2 = power(p2, mod2 - 2, mod2);
ipw[0] = {1, 1};
for (int i = 1; i < N; i++) {
ipw[i].first = 1LL * ipw[i - 1].first * ip1 % mod1;
ipw[i].second = 1LL * ipw[i - 1].second * ip2 % mod2;
}
}
pair<int, int> string_hash(string s) {
int n = s.size();
pair<int, int> hs({0, 0});
for (int i = 0; i < n; i++) {
hs.first += 1LL * s[i] * pw[i].first % mod1;
hs.first %= mod1;
hs.second += 1LL * s[i] * pw[i].second % mod2;
hs.second %= mod2;
}
return hs;
}
pair<int, int> pref[N];
void build(string s) {
int n = s.size();
for (int i = 0; i < n; i++) {
pref[i].first = 1LL * s[i] * pw[i].first % mod1;
if (i) pref[i].first = (pref[i].first + pref[i - 1].first) % mod1;
pref[i].second = 1LL * s[i] * pw[i].second % mod2;
if (i) pref[i].second = (pref[i].second + pref[i - 1].second) % mod2;
}
}
pair<int, int> get_hash(int i, int j) {
assert(i <= j);
pair<int, int> hs({0, 0});
hs.first = pref[j].first;
if (i) hs.first = (hs.first - pref[i - 1].first + mod1) % mod1;
hs.first = 1LL * hs.first * ipw[i].first % mod1;
hs.second = pref[j].second;
if (i) hs.second = (hs.second - pref[i - 1].second + mod2) % mod2;
hs.second = 1LL * hs.second * ipw[i].second % mod2;
return hs;
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
prec();
int n;
cin>>n;
string a;
cin >>a;
build(a);
//auto hash_b = string_hash(b);
int x,y;
int lk=n;
int dif;
for (int len = n/2; len >=1; len--) {
int ans=0;
//dif=0;
for (int i = 0; i + len - 1 < n; i += len) {
ans+= (get_hash(i, i + len - 1) == get_hash(0, len - 1));
dif=0;
if(get_hash(i, i + len - 1) != get_hash(0, len - 1))
x=i;
y=i+len-1;
int ll=0;
for(int k=x;k<=y;k++)
{
if(a[k]!=a[ll]) dif++;
ll++;
}
}
int p=n/len - 1;
bool okk=false;
if(ans==p && dif==1)
{
// if(dif==1) okk=true;
lk=len;
break;
}
}
cout<<lk<<'\n';
}