题面
大秦为你打开题目传送门
题目描述
有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S.
思路
我们直接,大力枚举这个插入的字符,然后大力哈希判断即可。
代码
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
| #include<bits/stdc++.h> using namespace std;
typedef unsigned long long ull;
const int N = 2e6 + 10; const int B = 31; ull Power[N];
int n; string s;
ull hsh[N]; inline ull Hash(int l, int r) { return l <= r ? hsh[r] - hsh[l - 1] * Power[r - l + 1] : 0; }
inline void Input() { cin >> s; s = ' ' + s; }
inline void Init() { Power[0] = 1; for(int i = 1; i <= n; i++) { Power[i] = Power[i - 1] * B; hsh[i] = hsh[i - 1] * B + (s[i] - 'A'); } }
inline void Work() { n = s.length() - 1;
if(n % 2 == 0) { printf("NOT POSSIBLE\n"); return ; } Init(); set<string >st; for(int i = 1; i <= n; i++) { ull hshL = Hash(1, n / 2), hshR = Hash(n / 2 + 2, n); int flag = 0; if(i != n / 2 + 1) { if(i <= n / 2) { hshL = Hash(1, i - 1) * Power[n / 2 - i + 1] + Hash(i + 1, n / 2 + 1); flag = 1; } else { hshR = Hash(n / 2 + 1, i - 1) * Power[n - i] + Hash(i + 1, n); } } if(hshL == hshR) { if(flag == 0) st.insert(s.substr(1, n / 2)); else st.insert(s.substr(n / 2 + 2)); } } if(st.empty()) printf("NOT POSSIBLE\n"); else if(st.size() > 1) printf("NOT UNIQUE\n"); else cout << *st.begin(); }
int main() { int T = 1; while(T--) { Input(); Work(); } return 0; }
|