CF 155C. Hometask 思维+模拟.

来源:互联网 发布:linux系统zip命令 编辑:程序博客网 时间:2024/05/17 05:15
题意:给出一个字符串s,k个二元组.二元组(a,b)表示字符a和字符b在字符串中不能相邻.(每个字符最多出现在一个二元组中).
|s|<=1e5,k<=13.问要使字符串s合法 最少需要删除多少个字符.


先把相邻相同的都合并在一起.现在字符串为:a[1],x,y,a[4],a[5]....

现在如果某个区间 出现:w,xyxyxyx,z (x,y)为矛盾 则要合法:删除该区间所有x或者删除该区间所有的y. 且删除后不会和相邻的产生矛盾.

#include <bits/stdc++.h>#define se second#define fi firstusing namespace std;typedef long long ll;typedef pair<char,int> ii;const int N=2e5+5,M=130;char s[N];vector<ii> a;int k,f[M],ban[M][M],vis[N]; void init(){for(int i=1,j;s[i];i=j){j=i+1;int cnt=1;char c=s[i];for(;s[j];j++)if(s[j]==c)cnt++;elsebreak;a.push_back(ii(c,cnt));}}int main(){scanf("%s%d",s+1,&k);init();char x,y;for(int i=1;i<=k;i++){cin>>x>>y;ban[x][y]=ban[y][x]=1;}int ans=0; for(int i=0,j;i<a.size()-1;i=j){ int x=a[i].fi,y=a[i+1].fi; int cx=a[i].se,cy=a[i+1].se; if(ban[x][y]) { for(j=i+2;j<a.size();j++) { if((j-i)%2){if(a[j].fi!=y)break;cy+=a[j].se;} else{if(a[j].fi!=x)break;cx+=a[j].se;}}ans+=min(cx,cy); } else j=i+1;}cout<<ans<<endl;return 0;} 


原创粉丝点击