Neighboring Characters zoj 4010(hash)

本文介绍了一种解决特定字符串处理问题的方法,通过将环形数组转换为线性数组简化问题,利用哈希技术快速判断子串的相似性,并提供了一个O(n)的高效算法实现。

题目连接:这里写链接内容
思路:题目要求从任意位置删除k个元素使得没有相邻的字母相同,如果我们去考虑删除一些元素,再得到删除后的元素,这样子显然是很麻烦的,而且复杂度也不允许,那么我们直接考虑
保留后的元素,这里保留后的元素有可能本身就是连续的,也有可能是有两段拼接而成的,第二种显然是不好处理的,那么我们考虑将环变成链,那么这样所有的可能保留下来的都是本身就是连续的,那么接下来显然是要找出所有连续的没有相邻的为相同的字串,找到这些子串后,我们去枚举保留下来的长度,接下来有个问题就是,就算保留下来的是满足的,但是有可能首尾是相同的,我们手动模拟后发现,其实就是判断下前缀后缀是否相同就行了,因为如果前缀后缀完全相同,那么对于当前的字串是不可能找到当前枚举长度首尾不相同的子串的,用hash判断即可
O(n)
accode

#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define ULL unsigned long long
using namespace std;
const int maxn = 1e6+2;
ULL jz[maxn*2];
int base = 233;
ULL S[maxn*2];
char s[maxn*2];
int ans[maxn];
ULL getHash(int s,int e)
{
    return S[e]-S[s-1]*jz[e-s+1];
}
int main()
{
    int t;
    jz[0] = 1;
    for(int i = 1;i<2*maxn;i++){
        jz[i] = jz[i-1]*base;
    }
    scanf("%d",&t);
    while(t--){
        scanf("%s",s+1);
        int len = strlen(s+1);
        for(int i = 1;i<=len;i++){
            s[len+i] = s[i];
        }
        S[0] = 0;
        for(int i = 1;i<=2*len;i++){
            S[i] = S[i-1]*base + (s[i]-'a')+1;
        }
        memset(ans,0,sizeof(ans));
        int i = 1;
        int j = i+1;
        for( i = 1;i<=2*len;i = j)
        {
            j = i+1;
            while(j<=2*len&&s[j]!=s[j-1]){
                j++;
            }
            int L = j-1-i+1;
            //cout<<i<<' '<<j-1<<' '<<L<<endl;
            for(int k = 2;k<=L;k++){
                if(k>len) break;
               // cout<<i<<' '<<j-k<<' '<<k<<' '<<i+k-1<<' '<<j-1<<endl;
                if(getHash(i,j-k)!=getHash(i+k-1,j-1)) ans[len-k] = 1;
            }
        }
        ans[len-1] = 1;
        for(int i = 0;i<len;i++){
            printf("%d",ans[i]);
        }
        puts("");
    }
}
<think> 嗯,用户想深入了解具有4个价电子的元素半导体如何通过共享电子形成晶体结构。从用户补充的提问细节看,ta特别关注"与4个相邻原子共享价电子"的成键原理,这需要结合晶体结构和化学键理论来解释。 用户提供的引用资料很有价值:[1]和[3]提到硅的共价键及金刚石结构,[2][4][5]则涉及掺杂机制,但这些不是当前问题的核心。需要聚焦在纯净半导体的本征结构上。 核心解释点应该是: 1 价电子数决定配位数:4个价电子正好能满足每个原子与4个邻原子形成共价键(8电子稳定规则) 2 空间构型:金刚石结构的四面体排列(可引用[3]的菱形结构说明) 3 电子共享机制:每个共价键含2个共享电子(可结合[1]的"共享两个电子"描述) 4 能带形成:局部共价键延伸为整个晶体的价带和导带(参考[4]的导电性解释) 需要特别注意用户提到的"与4个相邻原子"这个定量关系。可以强调:正因为四个价电子均参与成键,才使晶体在绝对零度时导带全空,实现半导体特性——这与金属的自由电子完全不同。 可能延伸的点:为什么不是3或5个价电子?因为3个会形成缺电子结构(如硼),5个则多出未成键电子(如磷),这正好解释了掺杂原理[2][5],不过用户当前问题不涉及掺杂。 </think> 基于具有4个价电子的元素半导体(如硅、锗)形成晶体的关键原理如下: ### 一、成键原理 1. **四面体键合** 每个原子通过$sp^3$杂化轨道与**4个相邻原子**形成共价键。以硅为例: - 基态电子构型:$[Ne] 3s^2 3p^2$ - 激发态:$3s^1 3p^3$(吸收能量后) - 杂化轨道:形成4个等价的$sp^3$轨道,键角为$109.5^{\circ}$[^1][^3] 2. **电子共享机制** 每个共价键包含**2个共享电子**(每个原子贡献1个电子),达到稳定的8电子壳层: ``` 硅原子A:提供1个电子 → 与原子B共享 硅原子B:提供1个电子 → 与原子A共享 键合后:A和B各自拥有"共享电子对"满足八隅体规则[^3] ``` ### 二、晶体结构特征 1. **金刚石立方晶格** - 空间群:$Fd\overline{3}m$(面心立方) - 配位数:4(每个原子连接4个邻居) - 单胞原子数:8(4个原子位于晶格点,4个位于四面体间隙)[^1][^3] 2. **键长与键能**(典型值) | 材料 | 键长 (Å) | 键能 (kJ/mol) | |---|---|----| | Si | 2.35 | 222 | | Ge | 2.45 | 188 | ### 三、电子行为与能带 1. **能带形成机制** - 成键轨道 → 形成**价带**(完全填满) - 反键轨道 → 形成**导带**(绝对零度时全空) - 能隙宽度:Si为$1.12\ eV$,Ge为$0.67\ eV$[^4] 2. **温度效应** 导电率随温度升高而增大: $$ \sigma \propto e^{-E_g/(2kT)} $$ 其中$k$为玻尔兹曼常数,$T$为绝对温度[^4] ### 四、与本征半导体的关系 当晶体纯度极高(杂质$<10^{10}/\text{cm}^3$)时: - 自由电子浓度 $n_i$ = 空穴浓度 $p_i$ - 载流子浓度公式: $$ n_i = \sqrt{N_c N_v} \ e^{-E_g/(2kT)} $$ $N_c, N_v$分别为导带/价带有效态密度[^1][^4] --- ![](https://via.placeholder.com/400x200?text=金刚石结构示意图) *图:四面体键合结构(每个中心原子连接4个顶点原子)[^3]*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值