字符串处理--HDU第2609解题报告

本文介绍了一种通过寻找字符串的最小表示来判断同构串的方法,并利用C++实现了一个程序,该程序能够计算一组输入字符串中不同同构串的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

这题本来不明白是什么意思,还以为是每个串的数字加起来,如果相等就表明是相等的串,但原来不来。


而是--》如果两个串是同构串,那么这两个串相等,为一个相同的串,我们就是要找出给出的数据中有多少不同的串。

这就要用找最小表示法了,如果两个串是同构串,那么这两个串的最小表示S1 == S2

http://blog.youkuaiyun.com/u012501262/article/details/21823363

找出后最小表示S后,存进map容器

最后map.size()的大小就是不同的串的数量


下面是代码:

//http://acm.hdu.edu.cn/showproblem.php?pid=2609

#include<iostream>
#include<string>
#include<map>
#include<cstdio>
using namespace std;

int find_min_subs(string &str);
int main()
{
	string str;
	
	int n;
	//freopen("d:/in.txt","r",stdin);
	while(cin>>n)
	{
		map<string,int>m;
		while(n--)
		{
			cin>>str;
			int index = find_min_subs(str);
			string str2(str.begin()+index,str.end());
			string str3(str.begin(),str.begin()+index);
			str2+=str3;
			m[str2];
		}
		cout<<m.size()<<endl;
		
		
	}

}

int find_min_subs(string &str)//朴素的寻找法
{
	int i;
	int j;
	int k;
	i = 0;
	j = 1;
	k = 1;
	for(;i<str.size() && j<str.size() ;)
	{
		if(str[i] > str[j])//大于,说明以j开始的串比较小,我们已该串为标准,再找出比它还小的
		{
			i = j;
			j = j+1;
		}
		else if(str[i] < str[j])//说明j指向的串不是最小的,比较下一个
		{
			++j;
		}
		else//相等,不能判断两个字符串哪个小,比较下一位
		{
			k=1;
			while(k<str.size())
			{
				if(str[(i+k)%str.size()] == str[(j+k)%str.size()])
					k++;
				else if(str[(i+k)%str.size()] < str[(j+k)%str.size()])
				{
					j++;
					break;
				}
				else
				{
					i=j;
					j=j+1;
					break;
				}

			}
			if(k==str.size())//表明两个同构串相等,取下标比较小的那一个
				j++;
		}
	}
	return i;
	//返回从第i个字符开始时str的最小表示
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值