奥赛一本通 1459 friends
1459 friends
题目大意
将一个字符串复制一遍后又插入了一个字符得到了新字符串,求原先的字符串。
知识要点
字符串
解题思路
显然字符串的长度应该是奇数,如果取出最中间的字符后分成两段,必有一段就是原先的字符串。可以假设某一段就是答案,那么剩下的一段应该恰好多出一个字符,分别检查两种情况即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
char s[2000005];
bool match(int l, int r, int b, int e) { //检查是否仅多一个字符
while(l != r && b != e) if(s[l] == s[b++]) l++;
return l == r;
}
int main() {
int m, n, t;
scanf("%d%s", &n, s);
if(n % 2 == 0) return puts("NOT POSSIBLE"); //偶数长度不可能
m = n / 2;
t = match(0, m, m, n) + match(m + 1, n, 0, m + 1) * 2;
switch(t) {
case 0: return puts("NOT POSSIBLE");
case 1: s[m] = 0; return puts(s); //左半段
case 2: return puts(s + m + 1); //右半段
}
if(match(0, m, m + 1, n)) return puts(s + m + 1); //两段相同
else return puts("NOT UNIQUE");
}

浙公网安备 33010602011771号