Three Friends

[BalticOI 2014 Day1] Three Friends

题目描述

有一个字符串 S S S,对他进行操作:

  1. S S S 复制为两份,存在字符串 T T T
  2. T T T 的某一位置上插入一个字符,得到字符串 U U U

现在给定 U U U,求 S S S

输入格式

第一行一个整数 N N N 代表 U U U 的长度。
第二行 N N N 个字符代表字符串 U U U

输出格式

  • 如果不能通过上述的步骤从 S S S 推到 U U U,输出 NOT POSSIBLE
  • 如果从 U U U 得到的 S S S 不是唯一的,输出 NOT UNIQUE
  • 否则,输出一个字符串 S S S

样例 #1

样例输入 #1

7
ABXCABC

样例输出 #1

ABC

样例 #2

样例输入 #2

6
ABCDEF

样例输出 #2

NOT POSSIBLE

样例 #3

样例输入 #3

9
ABABABABA

样例输出 #3

NOT UNIQUE

提示

数据规模与约定

本题采用捆绑测试。

  • Subtask 1(35 pts): N ≤ 2001 N \le 2001 N2001
  • Subtask 2(65 pts):无特殊限制。

对于 100 % 100\% 100% 的数据, 2 ≤ N ≤ 2 × 1 0 6 + 1 2 \le N \le 2 \times 10^6+1 2N2×106+1,保证 U U U 中只包含大写字母。

说明

翻译自 BalticOI 2014 Day1 B Three Friends。

读题

经典的hash题啊,用hash做是不错的,效率很高,那么就让笔者用string水了吧。

代码

#include
#include
using namespace std;
string a,b,s;
bool f1=0,f2=0;
int l=0;
int main() {
    int n;
    cin>>n>>s;
    if (!(n&1)) cout<<"NOT POSSIBLE";
    else {
    	int x=n/2;
		a = s.substr(0,x);
		b = s.substr(n-x,x);
		for (int i=x;i<=n-1 and l<x;i++)
			if (s[i]==a[l]) l++;
		if (l==x) f1=1;
		l=0;
		for (int i=0;i<=n-x-1 and l<x;i++)
			if (s[i]==b[l]) l++;
		if (l==x) f2=1;
		if (!f1 and !f2) cout<<"NOT POSSIBLE";
		else if (f1 and f2 and a!=b) cout<<"NOT UNIQUE";
		else
			if (f1) cout<<a; else cout<<b;
	}
    return 0;
}

分析

hash题就用hash做,但笔者选择string+暴力,并采用压行技术,让代码可读性提到最高了
这段代码是用于判断给定字符串是否可拆分为两个相等的部分的算法。我来解释一下代码的逻辑:

初始

通过 cin 输入一个整数 n 和一个字符串 s。

接下来的条件判断语句 if (!(n&1)) cout<<“NOT POSSIBLE”; 检查 n 是否为奇数,如果是偶数,则输出 “NOT POSSIBLE”,表示无法拆分成两个相等的部分。至于((!(n&1))的意义与原理,留给读者思考。

否则,计算出拆分位置 x,即 n/2。后面需以x为界限进行匹配即可。

使用 string::substr 函数将字符串 s 分别拆分成前半部分 a 和后半部分 b。

判断

使用 for 循环遍历字符串 s 的后半部分,比较每个字符是否与 a 中对应位置的字符相同,如果相同,则将 l ++。这里的变量 l 是一个计数器,用于记录成功匹配的字符数量。

如果 l == x,则表示成功匹配了 x 个字符,将 f1 设置为 true,表示前半部分 a 是可行的。

清零 l,重复以上的过程,但这次遍历的是字符串 s 的前半部分,比较每个字符是否与 b 中对应位置的字符相同。

同样,如果 l 等于 x,则表示成功匹配了 x 个字符,将 f2 设置为 true,表示后半部分 b 是可行的。

根据 f1 和 f2 的取值,输出结果。如果两者都为 false,则输出 “NOT POSSIBLE”;如果两者都为 true,且 a 不等于 b,则输出 “NOT UNIQUE”;否则根据 f1 的取值输出 a 或 b。(想一想,为什么)

end

string过hash,是种技巧吧。

你可能感兴趣的:(算法,c++,开发语言)