一道细节好题——GDOI2017房屋购置

本文深入探讨了KMP算法的实现细节,并提供了一个具体的示例程序,通过该程序可以理解如何利用KMP算法进行字符串匹配及替换。文章还特别关注了在实际编程中可能遇到的复杂情况和调整方法。

房屋购置

这显然是道裸的kmp题,

~~ 但由于我看错题目,我不知道怎么做~~(我以为换过的字符串可以再换)
仔细看看题目,发现题目就是到裸题
但细节比较难改:

#include<bits/stdc++.h>
using namespace std;

const int N=30,LON=100010;
int n,m;
char s[N][LON],a[N][LON],b[N][LON];
int kmp[N];
inline void get_kmp(int x)
{
	int len=strlen(a[x]+1);
	int j=0;
	kmp[j]=0;
	for(int i=2;i<=len;i++){
		while(a[x][i]!=a[x][j+1]&&j>0) j=kmp[j];
		if(a[x][i]==a[x][j+1]) {
		    j++;    	
		}
		kmp[i]=j;
		int g=kmp[i];
	}
}
inline void cal(int x)
{
	int lon=strlen(s[x]+1);
	for(register int j=1;j<=m;j++){
	    	get_kmp(j);
		int len=strlen(a[j]+1);
		int strt=0;
		for(register int k=1;k<=lon;k++){
			if(s[x][k]=='1') continue;
			while(s[x][k]!=a[j][strt+1]&&strt>0) strt=kmp[strt];
			if(s[x][k]==a[j][strt+1]) {
			   strt++; 
		  }
		if(strt==len){
			strt=0;
			int ll=strlen(b[j]+1);
			int o=k,sum=0;
			for(register int i=ll;i>=1&&sum<=len;i--)
			{
			    while(s[x][o]=='1') o--;
					sum++; 
			     	s[x][o]=b[j][i];
			     	o--;
			     }
				 if(sum<len){
				 	for(register int i=o;i>0&&sum<len;i--)
				 	{
				 	  while(s[x][i]=='1') i--;
				 	  sum++;
				      s[x][i]='1';		 
				 	}
				}
			}   
		} 
   }
	for(register int i=1;i<=lon;i++){
		if(s[x][i]=='1') continue;
		printf("%c",s[x][i]);
	    }
	puts("");
}
inline void solve(){
	for(int i=1;i<=n;i++){
		cal(i);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;i++){
		scanf("%s",s[i]+1);
	}
	for(register int j=1;j<=m;j++){
		scanf("%s %s",a[j]+1,b[j]+1);
	}
	solve();
}

不过网上有些题解的代码量会短一些,可以看看

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值