2018.09.23模拟总结(T2)

T1,T3我就不说啦,反正也不会。主要想讲的是T2.

  T2用了一个神奇的算法:折半搜索。

  因为这个坑爹的数据范围告诉我们暴搜或是状压会TLE,而一半刚好能卡过去。

  折半搜索其实跟暴搜没什么区别,就是折了半(废话)。拿这道题为例,暴搜就是在长度为2n的序列中找出所有长度为n的序列不妨设为s1, 那么剩下的就是s2,然后判断s1和翻转后的s2是否相等,复杂度O(C(n, 2n))。

  折半搜索就是在前一半的序列中找出所有长度为n / 2的序列,也就是s1的前一半s1',剩下的作为s2的后一半(因为要反转)s2'。然后把这种状态,即s1' + s2'记下来,用map实现最方便。接下来我们在[n + 1, 2n]这个区间里暴搜,找到s1的后一半s1'',s2的前一半s2''(当然还要反转),为了验证两个合一块的字符串是否相等,我们只要证明s2'' + s1''是否存在过,如果存在,就说明找到了一组,ans++。时间复杂度O(C(n / 2, n) * 2)。理论上也是暴搜,却快了不少。

  代码实现的时候用string最方便不过,不仅用加号就能代替strcpy,而且还自带反转函数。

代码就是两遍状压暴搜

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cctype>
 8 #include<vector>
 9 #include<stack>
10 #include<queue>
11 #include<map>
12 #include<string>
13 using namespace std;
14 #define enter puts("") 
15 #define space putchar(' ')
16 #define Mem(a, x) memset(a, x, sizeof(a))
17 #define rg register
18 typedef long long ll;
19 typedef double db;
20 const int INF = 0x3f3f3f3f;
21 const db eps = 1e-8;
22 const int maxn = 40;
23 inline ll read()
24 {
25     ll ans = 0;
26     char ch = getchar(), last = ' ';
27     while(!isdigit(ch)) {last = ch; ch = getchar();}
28     while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}
29     if(last == '-') ans = -ans;
30     return ans;
31 }
32 inline void write(ll x)
33 {
34     if(x < 0) x = -x, putchar('-');
35     if(x >= 10) write(x / 10);
36     putchar(x % 10 + '0');
37 }
38 void MYFILE()
39 {
40 #ifndef mrclr
41     freopen("string.in", "r", stdin);
42     freopen("string.out", "w", stdout);
43 #endif
44 }
45 
46 int n;
47 char s[maxn];
48 string s1, s2;
49 map<string, int> mp;
50 ll ans = 0;
51 
52 int main()
53 {
54     MYFILE();
55     n = read(); scanf("%s", s);
56     for(int i = 0; i < (1 << n); ++i)
57     {
58         s1.clear(); s2.clear();
59         for(int j = 0; j < n; ++j)
60             if(i & (1 << j)) s1 += s[j];
61             else s2 += s[j];
62             reverse(s2.begin(), s2.end());
63             mp[s1 + "#" + s2]++;    //加一个字符,区分s1, s2 
64     }
65     for(int i = 0; i < (1 << n); ++i)
66     {
67         s1.clear(); s2.clear();
68         for(int j = 0; j < n; ++j)
69             if(i & (1 << j)) s1 += s[j + n];
70             else s2 += s[j + n];
71             reverse(s2.begin(), s2.end());
72             ans += mp[s2 + "#" + s1];
73     }    
74     write(ans >> 1); enter;
75     return 0;
76 }
View Code

 

转载于:https://www.cnblogs.com/mrclr/p/9743790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值