Submission #6652689
Source Code Expand
#include <bits/stdc++.h> #define rep(i, a, b) for (ll i = (a); i < (b); i++) typedef uint64_t ull; typedef int64_t ll; typedef std::pair<ll, ll> PLL; using namespace std; const int MAX = 500000, MS = 2; const long long mod[] = {999999937LL, 1000000007LL}, base = 9973; struct rolling_hash { int n; vector<long long> hs[MS], pw[MS]; rolling_hash(){} rolling_hash(const string &s) { n = s.size(); for (int i = 0; i < MS; i++) { hs[i].assign(n+1,0); pw[i].assign(n+1,0); hs[i][0] = 0; pw[i][0] = 1; for (int j = 0; j < n; j++) { pw[i][j+1] = pw[i][j]*base%mod[i]; hs[i][j+1] = (hs[i][j]*base+s[j])%mod[i]; } } } long long hash(int l, int r, int i) { return ((hs[i][r]-hs[i][l]*pw[i][r-l])%mod[i]+mod[i])%mod[i]; } bool match(int l1, int r1, int l2, int r2) { bool ret = 1; for (int i = 0; i < MS; i++) ret &= hash(l1,r1,i)==hash(l2,r2,i); return ret; } bool match(int l, int r, long long h[]) { bool ret = 1; for (int i = 0; i < MS; i++) ret &= hash(l,r,i)==h[i]; return ret; } }; class UnionFind { public: int n; std::vector<int> par; std::vector<int> num; explicit UnionFind(int n) { // [0 n)のunion find this->n = n; this->par.resize(n); this->num.resize(n, 1); for (int i = 0; i < n; i++) { this->par[i] = i; } } int root(int i) { if (par[i] == i) return i; else return par[i] = root(par[i]); } bool same(int i, int j) { return root(i) == root(j); } // もしすでに、くっ付いていたら-1を返す int unite(int i, int j) { int t = root(i); int k = root(j); if (t == k) return -1; par[t] = k; num[k] += num[t]; return 0; } int size(int i) { return num[root(i)]; } }; signed main() { string s,t; cin>>s>>t; ll N = s.size(); ll NT = t.size(); string p=""; while(p.size() < 3*NT || p.size() < 3*N){ p += s; } s = p; vector<bool> ok(N, false); //cout<<"s="<<s<<endl; //cout<<"t="<<t<<endl; auto rh = rolling_hash(t+s); for (int i=0; i<N; i++) { //cout<<0<<" " << t.size()+i << " " << sa.prefixCommonLength(0, t.size()+i) << endl; //if(lh.prefixCommonLength(0, NT+i) >= NT ){ if (rh.match(0, NT, NT+i, 2*NT+i)){ ok[i%N] = true; } } auto uf = UnionFind(N); rep(i,0,N){ if (ok[i] && ok[(i+NT)%N]){ ll res = uf.unite(i, (i+NT)%N); if (res == -1){ cout<<-1<<endl; return 0; } } } ll ans = 0; for (int i=0;i<N;i++) { if (ok[i]) ans = max(ans, (ll)uf.size(i)); } cout<<ans<<endl; return 0; }
Submission Info
Submission Time | |
---|---|
Task | F - Strings of Eternity |
User | bobuhiro11 |
Language | C++14 (GCC 5.4.1) |
Score | 600 |
Code Size | 3038 Byte |
Status | AC |
Exec Time | 217 ms |
Memory | 89424 KiB |
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 600 / 600 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | a01, a02, a03 |
All | a01, a02, a03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49, b50, b51, b52, b53, b54, b55, b56, b57, b58, b59, b60, b61, b62, b63, b64, b65, b66, b67, b68, b69, b70 |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
a01 | AC | 1 ms | 256 KiB |
a02 | AC | 1 ms | 256 KiB |
a03 | AC | 1 ms | 256 KiB |
b04 | AC | 1 ms | 256 KiB |
b05 | AC | 1 ms | 256 KiB |
b06 | AC | 1 ms | 256 KiB |
b07 | AC | 1 ms | 256 KiB |
b08 | AC | 1 ms | 256 KiB |
b09 | AC | 1 ms | 256 KiB |
b10 | AC | 1 ms | 256 KiB |
b11 | AC | 1 ms | 256 KiB |
b12 | AC | 182 ms | 68656 KiB |
b13 | AC | 217 ms | 89424 KiB |
b14 | AC | 190 ms | 68664 KiB |
b15 | AC | 125 ms | 66824 KiB |
b16 | AC | 153 ms | 57372 KiB |
b17 | AC | 178 ms | 68664 KiB |
b18 | AC | 179 ms | 68664 KiB |
b19 | AC | 154 ms | 57244 KiB |
b20 | AC | 178 ms | 68664 KiB |
b21 | AC | 203 ms | 84816 KiB |
b22 | AC | 202 ms | 84816 KiB |
b23 | AC | 209 ms | 87120 KiB |
b24 | AC | 146 ms | 54044 KiB |
b25 | AC | 178 ms | 68664 KiB |
b26 | AC | 145 ms | 53788 KiB |
b27 | AC | 203 ms | 84816 KiB |
b28 | AC | 207 ms | 86300 KiB |
b29 | AC | 203 ms | 84944 KiB |
b30 | AC | 204 ms | 84816 KiB |
b31 | AC | 202 ms | 84816 KiB |
b32 | AC | 178 ms | 68664 KiB |
b33 | AC | 178 ms | 68664 KiB |
b34 | AC | 178 ms | 68664 KiB |
b35 | AC | 203 ms | 84816 KiB |
b36 | AC | 159 ms | 60840 KiB |
b37 | AC | 178 ms | 68664 KiB |
b38 | AC | 178 ms | 68664 KiB |
b39 | AC | 202 ms | 84816 KiB |
b40 | AC | 178 ms | 68664 KiB |
b41 | AC | 178 ms | 68792 KiB |
b42 | AC | 202 ms | 84816 KiB |
b43 | AC | 203 ms | 85200 KiB |
b44 | AC | 179 ms | 69180 KiB |
b45 | AC | 203 ms | 84816 KiB |
b46 | AC | 202 ms | 84816 KiB |
b47 | AC | 182 ms | 68792 KiB |
b48 | AC | 159 ms | 60840 KiB |
b49 | AC | 179 ms | 68664 KiB |
b50 | AC | 179 ms | 68664 KiB |
b51 | AC | 203 ms | 84816 KiB |
b52 | AC | 179 ms | 68664 KiB |
b53 | AC | 203 ms | 84816 KiB |
b54 | AC | 178 ms | 68664 KiB |
b55 | AC | 179 ms | 68664 KiB |
b56 | AC | 139 ms | 52636 KiB |
b57 | AC | 141 ms | 52524 KiB |
b58 | AC | 32 ms | 11708 KiB |
b59 | AC | 3 ms | 896 KiB |
b60 | AC | 37 ms | 13880 KiB |
b61 | AC | 12 ms | 4312 KiB |
b62 | AC | 22 ms | 9212 KiB |
b63 | AC | 139 ms | 52636 KiB |
b64 | AC | 178 ms | 68664 KiB |
b65 | AC | 178 ms | 68664 KiB |
b66 | AC | 202 ms | 84816 KiB |
b67 | AC | 202 ms | 84944 KiB |
b68 | AC | 178 ms | 68664 KiB |
b69 | AC | 178 ms | 68664 KiB |
b70 | AC | 202 ms | 84816 KiB |