题目大意:
给出一行字符串,求该行字符串内符合题目所述要求的子串(邮箱地址)有多少。
解题思路:
没什么好说的,像这种模拟题做起来修修改改的很烦,最好在写之前认真审清题意,在草稿纸上写好大概思路,写的时候适当加点注释,细心再细心减少修改次数和错误率。另外这题“@”号左边符合要求的连续字符数乘以“@”号右边的“.”号右边符合要求的连续字符数就等于通过这个“@“号所能组合出来的符合要求的子串(邮箱地址)数。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
char s[1000005];
int len;
long long findl (int i)
{
long long num=0;
while (i>=0)
{
if (s[i]>='a'&&s[i]<='z')
num++;
else if (s[i]!='_'&&(s[i]<'0'||s[i]>'9'))
break;
i--;
}
return num;
}
long long findr (int i)
{
long long num=0;
int j=i;
while (i<len)
{
if (!((s[i]>='a'&&s[i]<='z')||(s[i]>='0'&&s[i]<='9')))
break;
i++;
}
if (i>=len||s[i]!='.'||j==i)
return 0;
i++;
while (i<len)
{
if (s[i]>='a'&&s[i]<='z')
num++;
else
break;
i++;
}
return num;
}
int main()
{
gets(s);
len=strlen(s);
int i=0;
long long ans=0;
while (i<len)
{
if (s[i]=='@')
{
long long numl=findl(i-1);
long long numr=findr(i+1);
ans+=numl*numr;
}
i++;
}
printf("%I64d\n", ans);
return 0;
}