奥赛一本通 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");
}
posted @ 2026-09-22 09:40  萧西待水  阅读(18)  评论(0)    收藏  举报