您的位置:首页 > 其它

CF 155C. Hometask 思维+模拟.

2017-12-10 17:49 316 查看
题意:给出一个字符串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 first
using namespace std;
typedef long long ll;
typedef pair<char,int> ii;
const int N=2e5+5,M=130;
char s
;
vector<ii> a;
int k,f[M],ban[M][M],vis
;
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++;
else
break;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: